Expresiones regulares de SQL Server en T-SQL

¿Hay alguna biblioteca de expresiones regulares escrita en T-SQL (sin CLR, sin sp extendido, t-sql puro) para SQL Server?

(debería funcionar con hosting compartido)

Editar:

  • gracias, sé sobre las soluciones PATINDEX, LIKE, xp_ sps y CLR

  • También sé que no es el mejor lugar para regex, la pregunta es teórica 🙂

  • funcionalidad reducida también es aceptada

¿Qué tal la función PATINDEX ?

La coincidencia de patrones en TSQL no es una biblioteca de expresiones regulares completa, pero le brinda los conceptos básicos.

(De libros en línea)

 Wildcard Meaning % Any string of zero or more characters. _ Any single character. [ ] Any single character within the specified range (for example, [af]) or set (for example, [abcdef]). [^] Any single character not within the specified range (for example, [^a - f]) or set (for example, [^abcdef]). 

Hay una coincidencia de patrón básica disponible mediante el uso de LIKE, donde% coincide con cualquier número y combinación de caracteres, _ coincide con cualquier carácter y [abc] podría coincidir con a, b, o c … Hay más información en el sitio de MSDN .

Si alguien está interesado en usar regex con CLR aquí hay una solución. La función a continuació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 sub consultas. 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 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 el estudio de gestión, importe el archivo dll a través de progtwigbilidad – ensambles – nuevo ensamblaje

A continuación, ejecute esta consulta:

 CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50)) RETURNS smallint AS EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain 

Entonces debería tener acceso completo a la función a través de la base de datos en la que almacenó el ensamblado.

Luego, utilícelo en consultas como estas:

 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 

En caso de que alguien más aún esté viendo esta pregunta, http://www.sqlsharp.com/ es una forma gratuita y fácil de agregar funciones CLR de expresiones regulares a su base de datos.

Puede usar las características de expresiones regulares de VBScript usando OLE Automation. Esto es mucho mejor que la sobrecarga de crear y mantener un ensamblaje. Por favor, asegúrese de revisar la sección de comentarios para obtener una mejor versión modificada de la principal.

http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx

 DECLARE @obj INT, @res INT, @match BIT; DECLARE @pattern varchar(255) = ''; DECLARE @matchstring varchar(8000) = ''; SET @match = 0; -- Create a VB script component object EXEC @res = sp_OACreate 'VBScript.RegExp', @obj OUT; -- Apply/set the pattern to the RegEx object EXEC @res = sp_OASetProperty @obj, 'Pattern', @pattern; -- Set any other settings/properties here EXEC @res = sp_OASetProperty @obj, 'IgnoreCase', 1; -- Call the method 'Test' to find a match EXEC @res = sp_OAMethod @obj, 'Test', @match OUT, @matchstring; -- Don't forget to clean-up EXEC @res = sp_OADestroy @obj; 

Si obtiene el SQL Server blocked access to procedure 'sys.sp_OACreate'... error, use sp_reconfigure para habilitar los Ole Automation Procedures . (Sí, desafortunadamente eso es un cambio de nivel de servidor!)

Más información sobre el método de Test está disponible aquí

Feliz encoding

Si está utilizando SQL Server 2016 o superior, puede usar sp_execute_external_script junto con R. Tiene funciones para búsquedas de expresiones regulares, como grep y grepl .

Aquí hay un ejemplo de direcciones de correo electrónico. Voy a consultar a algunas “personas” a través del motor de la base de datos de SQL Server, pasar los datos de esas personas a R, dejar que R decida qué personas tienen direcciones de correo electrónico no válidas, y hacer que R transfiera ese subconjunto de personas a SQL Server. Las “personas” pertenecen a la tabla [Application].[People] en la base de datos de ejemplo [WideWorldImporters] . Se pasan al motor R como un dataframe llamado InputDataSet . R usa la función grepl con el operador “not” (¡signo de exclamación!) Para encontrar qué personas tienen direcciones de correo electrónico que no coinciden con el patrón de búsqueda de cadenas RegEx.

 EXEC sp_execute_external_script @language = N'R', @script = N' RegexWithR <- InputDataSet; OutputDataSet <- RegexWithR[!grepl("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[az]{2,4}))", RegexWithR$EmailAddress), ];', @input_data_1 = N'SELECT PersonID, FullName, EmailAddress FROM Application.People' WITH RESULT SETS (([PersonID] INT, [FullName] NVARCHAR(50), [EmailAddress] NVARCHAR(256))) 

Tenga en cuenta que las características apropiadas deben estar instaladas en el host de SQL Server. Para SQL Server 2016, se llama "Servicios de SQL Server R". Para SQL Server 2017, se renombró a "SQL Server Machine Learning Services".

Pensamientos de cierre La implementación de Microsoft de SQL (T-SQL) no tiene soporte nativo para RegEx. Esta solución propuesta puede no ser más deseable para el OP que el uso de un procedimiento almacenado CLR. Pero ofrece una forma adicional de abordar el problema.