Desde Microsoft SQL Server 2005 en adelante, existe la manera de acceder a funciones, escritas usando las librerías de .Net, desde stored procedure, funciones, triggers, etc.. ¡Esto nos dá un poder increíble ya que las posibilidades son infinitas! Para propósito de este artículo, vamos a demostrar como utilizar funciones, de regular expression, que se encuentran en un dll de .Net, desde una ventana de SQL.

Lo primero que debemos hacer es habilitar el Common Language Runtime (CLR) que por defecto no está habilitado.

sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

Ahora necesitamos crear nuestro dll que contendrá las funciones necesarias para ejecutar regular expressions desde SQL. Para esto abrimos Visual Studio y creamos un proyecto de tipo Class Library y lo nombramos SqlRegex.

Una vez creado el proyecto, creamos una clase con el nombre de SqlRegularExpression y escribimos el siguiente código:

/// <summary>
/// Clase que permite usar regular expressions
/// en MS SQL Server 2005+
/// </summary>
public partial class SqlRegularExpression
{
    /// <summary>
    /// Verifica si el texto dado cumple con el patrón.
    /// </summary>
    /// <param name="input">texto para validar</param>
    /// <param name="pattern">patrón regular expression</param>
    /// <returns>true - el texto cumple con el patrón, false - el texto no cumple con el patrón</returns>
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean IsRegexMatch(SqlChars input, SqlString pattern)
    {
        Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
        return regex.IsMatch(new string(input.Value));
    }

    /// <summary>
    /// Busca el resultado del regular expression
    /// </summary>
    /// <param name="input">texto para validar</param>
    /// <param name="pattern">patrón regular expression</param>
    /// <returns>resultado del regular expression</returns>
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString RegexMatch(SqlChars input, SqlString pattern)
    {
        Regex regex = new Regex(pattern.Value, RegexOptions.IgnoreCase);
        return regex.Match(new string(input.Value)).Value;
    }
}

El próximo paso es compilar el proyecto para luego registarlo en SQL Server. Para registrar el dll en SQL Server vamos a necesitar la localización física del dll recién creado. Así que abrimos el SQL Server Manager Studio y escribimos el siguiente comando:

CREATE ASSEMBLY SqlRegularExpression 
-- recuerda cambiar la localización del dll por la correcta
from 'd:\Projects\SqlRegularExpressions\
        SqlRegularExpressions\bin\Release\SqlRegularExpression.dll' 
WITH PERMISSION_SET = SAFE

¡Felicidades! Su dll ha sido registrado y desde ahora en adelante podremos usar sus funciones. Solo falta atar los métodos del dll a funciones de SQL. Así que escribimos:

CREATE FUNCTION [dbo].[IsRegexMatch](@input [nvarchar](max), @pattern [nvarchar](4000))
RETURNS [bit] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SqlRegex].[UserDefinedFunctions].[IsRegexMatch]

CREATE FUNCTION [dbo].[RegexMatch](@input [nvarchar](max), @pattern [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SqlRegex].[UserDefinedFunctions].[RegexMatch]

¡Eso es todo! Ahora podemos usar las funciones en nuestros queries. Por ejemplo, queremos saber todos los clientes cuyo nombre contenga la letra “a”:

SELECT * 
FROM   CLIENTES
WHERE  dbo.IsRegexMatch(NOMBRE, 'a+') = 1

Así de fácil.