Expresiones regulares en servidores SQL Server?

¿Es posible realizar consultas eficientes que usan la función de expresión regular completa establecida?

Si no, Microsoft realmente debería considerar esa característica.

Para SQL Server 2000 (y cualquier otra edición de 32 bits de SQL Server), existe xp_pcre , que introduce expresiones regulares compatibles con Perl como un conjunto de procedimientos almacenados extendidos. Lo he usado, funciona.

Las versiones más recientes le dan acceso directo a las expresiones regulares integradas .NET (este enlace parece estar muerto, aquí hay otro: MSDN: Cómo: Trabajar con objetos de base de datos CLR ).

La respuesta es no, no en el caso general, aunque puede depender de lo que quiere decir eficiente. Para estos fines, utilizaré la siguiente definición: ‘Hace un uso efectivo de los índices y las uniones en un orden razonable’ que probablemente sea tan bueno como cualquier otro.

En este caso, las consultas ‘Eficientes’ son ‘s-arg’-able, lo que significa que pueden usar búsquedas de índice para restringir los predicados de búsqueda. Las desigualdades (t-join) y las desigualdades simples pueden hacer esto. Los predicados “AND” también pueden hacer esto. Después de eso, entramos en el análisis de tabla, índice y rango, es decir, operaciones que tienen que hacer comparaciones registro por registro (o índice por teclado por índice).

La respuesta de Sontek describe un método para alinear la funcionalidad de expresiones regulares en una consulta, pero las operaciones aún tienen que hacer comparaciones registro por registro. Envolverlo en una función permitiría un índice basado en funciones en el que el resultado de un cálculo se materialice en el índice (Oracle lo admite y puede obtener una funcionalidad equivalente en SQL Server utilizando el tipo de trucos discutidos en este artículo ). Sin embargo, no podrías hacer esto para una expresión regular arbitraria.

En el caso general, la semántica de una expresión regular no se presta para eliminar conjuntos de coincidencias de la forma en que lo hace un índice, por lo que probablemente no sea posible integrar el soporte de rexegp en el optimizador de consultas.

Mira esto y esto . Son excelentes publicaciones sobre cómo hacerlo.

Me encantaría tener la capacidad de invocar de forma nativa expresiones regulares en SQL Server para consultas ad hoc y utilizarlas en procedimientos almacenados. Nuestros DBA no nos permitirán crear funciones CLR, así que he estado utilizando LINQ Pad como una especie de editor de consultas para pobres para las cosas ad hoc. Es especialmente útil cuando se trabaja con datos estructurados como JSON o XML que se han guardado en la base de datos.

Y acepto que parece un descuido que no hay soporte de expresiones regulares, parece una característica obvia para un lenguaje de consulta. Esperemos que lo veamos en una versión futura, pero la gente lo ha estado pidiendo durante mucho tiempo y todavía no ha llegado al producto.

La razón más frecuente que he visto en contra es que una expresión mal formada puede causar retrocesos catastróficos que en .NET no abortarán y casi siempre requieren que la máquina se reinicie. Quizás una vez que aborden eso en el marco lo veremos incluido en una versión futura de SQL Server.

Creo que podemos ver a partir de los nuevos tipos en SQL Server 2008 (hierarchyid, geo-spatial) que si Microsoft lo agrega, vendrá en la forma de un SQL CLR Assembly

Si puede instalar Assemblies en su base de datos, puede crear el suyo creando un nuevo proyecto de Database \ SQL Server en Visual Studio; esto le permitirá crear un nuevo Trigger / UDF / Stored Proc / Aggregate o UDT. Puede importar System.Text.RegularExpressions en la clase e ir desde allí.

Espero que esto ayude