2010-07-15 14 views
7

¿Hay alguna manera de convertir expresiones regulares en LIKE dentro de una función (MSSQL)? El procedimiento almacenado no puede ser más complicado que esto:Sql Me gusta RegEx

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+) 

Los grupos no serán utilizados en el LIKE, que están ahí para otro propósito.

me gustaría usar esta dentro de un procedimiento almacenado finales como:

SELECT * FROM [Table] 
WHERE test_regex(regex, 'text') = 1 

Donde la expresión regular es una parte de [Tabla]

+1

¿Qué estás tratando de lograr? ¿Algún tipo de mecanismo de despacho basado en tablas donde las reglas se expresan como expresiones regulares? ... Solo curiosidad si adiviné correctamente. –

+0

Supongo que se analizarán los archivos de registro. Eso parece una cadena de consulta. –

+0

Tomek son correctos :) – Andreas

Respuesta

4

Es posible agregar el análisis de expresiones regulares al servidor SQL, utilizando una función CLR. Esto es posible desde SQL 2005 en adelante. Vea here para un gran ejemplo.

+0

Finalmente obtuve una respuesta de ellos, debería funcionar bien .. Gracias. Y a pesar de que su respuesta no acaba de responder mi pregunta, resuelve mi problema. Así que lo marco como resuelto :) – Andreas

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia Las respuestas solo de enlace pueden dejar de ser válidas si la página vinculada cambia – Moes

3

Comprobar esta función de SQL. Se puede ayudar a lograr su tarea: PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

¿Hay alguna manera de decirle a la función que varias instancias de una expresión, como regex: s "+" o "*". Por ejemplo PATINDEX ('% [a-c] +%', @ Entrada) – Andreas

+0

no, no creo que sea posible –

1

no fuera de la caja. Lo más cerca que puede llegar a una búsqueda de expresiones regulares en SQL Server es PATINDEX(), pero eso no hace expresiones regulares.

Si realmente quería esto, tendría que hacer una función CLR para ejecutar la expresión regular en su lugar. Puede que le preocupe la velocidad, pero diría que casi nada de lo que haría con las expresiones o patrones regulares podría usar un índice de todos modos.

2

que correrá muy lento en una tabla grande, analizando la columna de cadena en cada fila.

si puede cambiar la tabla, puede ser mejor dividir esa columna de cadena en columnas diferentes, para que pueda tener una WHERE country=... AND sessionid=... más tradicional, incluso podría agregar y usar un índice de esta manera.

4

me imagino

SELECT ... 
FROM [Table] 
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' 

podría estar lo suficientemente cerca? Si el objetivo es simplemente traer de vuelta registros con un país no en blanco y valores de sesión.

Si el valor en la columna no necesariamente comenzaría con 'país', tendría que usar WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%', lo que podría ralentizar considerablemente las cosas según la respuesta de KM.

1

Utilice la funcionalidad RegEx dentro de SQL#, que es gratuita. No he tenido ningún problema de rendimiento con este enfoque.

Cuestiones relacionadas