Si alguien está interesado en usar expresiones regulares con CLR, aquí hay una solución. La siguiente función (C # .net 4.5) devuelve un 1 si el patrón coincide y un 0 si el patrón no coincide. Lo uso para etiquetar líneas en subconsultas. El atributo SQLfunction le dice al servidor SQL que este método es el UDF real que usará el servidor SQL. Guarde el archivo como un archivo DLL en un lugar donde pueda acceder desde el estudio de administración.
// default using statements above
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
namespace CLR_Functions
{
public class myFunctions
{
[SqlFunction]
public static SqlInt16 RegexContain(SqlString text, SqlString pattern)
{
SqlInt16 returnVal = 0;
try
{
string myText = text.ToString();
string myPattern = pattern.ToString();
MatchCollection mc = Regex.Matches(myText, myPattern);
if (mc.Count > 0)
{
returnVal = 1;
}
}
catch
{
returnVal = 0;
}
return returnVal;
}
}
}
En Management Studio, importe el archivo dll a través de programabilidad - ensamblados - nuevo ensamblaje
Luego ejecute esta consulta:
CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50))
RETURNS smallint
AS
EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain
Entonces debe tener acceso completo a la función a través de la base de datos en la que almacenó el ensamblado.
Luego, use en consultas como esta:
SELECT *
FROM
(
SELECT
DailyLog.Date,
DailyLog.Researcher,
DailyLog.team,
DailyLog.field,
DailyLog.EntityID,
DailyLog.[From],
DailyLog.[To],
dbo.RegexContain(Researcher, '[\p{L}\s]+') as 'is null values'
FROM [DailyOps].[dbo].[DailyLog]
) AS a
WHERE a.[is null values] = 0
SAFE
y no marcadas comoEXTERNAL_ACCESS
oUNSAFE
(ya que entiendo por qué esos 2 últimos Conjuntos de permisos serían problemáticos para un entorno de alojamiento compartido). Microsoft Azure SQL Database V12 (es decir, la nueva versión a finales de 2014), que es un entorno compartido, permite ensamblados marcados comoSAFE
(y cargados a través de, enFROM 0x...
lugar de desde un archivo DLL, ya que no puede cargar un archivo DLL). PeroSAFE
es todo lo que se necesita para las expresiones regulares y MUCHAS otras funciones muy útiles.