2008-11-21 18 views
6

Si tengo una consulta como SELECT * from authors where name = @name_param, ¿hay una expresión regular para analizar los nombres de los parámetros (específicamente el "nombre_parámetro")?Regex para analizar los parámetros de SQL

Gracias

+0

No estoy seguro exactamente de lo que está preguntando. ¿Puedes aclarar o dar un ejemplo? ¿Desea pasar una lista de nombres y hacer que convierta el DÓNDE nombrar en (nombre_a, nombre_b, ...)? y necesita especificar el RDBMS, el soporte Regex es diferente entre ellos. –

Respuesta

8

Esto es complicado porque params también pueden ocurrir dentro de cadenas entre comillas.

SELECT * FROM authors WHERE name = @name_param 
    AND string = 'don\'t use @name_param'; 

¿Cómo la expresión regular saber para usar el primer @name_param pero no la segunda?

Es un problema que se puede resolver, pero no es práctico hacerlo en una sola expresión regular. Tuve que manejar esto en Zend_Db, y lo que hice fue eliminar primero todas las cadenas entre comillas y los identificadores delimitados, y luego puedes usar expresiones regulares en el resto.

Puede ver el código aquí: http://framework.zend.com/code/browse/~raw,r=8064/Zend_Framework/trunk/library/Zend/Db/Statement.php

Ver funciones _stripQuoted() y _parseParameters().

+3

Sin mencionar los nombres de parámetros que aparecen en los comentarios de SQL. Los regex son geniales, pero no necesariamente geniales para los trabajos de análisis. –

+0

Sí, es un buen punto sobre los comentarios de SQL. –

4

Dado que no tiene cadenas entre comillas o comentarios con parámetros en ellos, la expresión regular requerida sería bastante trivial:

@([_a-zA-Z]+)  /* match group 1 contains the name only */ 

voy con Bill Karwin's recommendation ser prudente, sabiendo que el enfoque ingenuo tiene sus trampas. Pero si evalúa los datos que maneja, esta expresión regular sería todo lo que necesita.

+0

Observación pequeña: los números también son válidos en los nombres de los parámetros, por lo que la expresión regular debe ser @ ([_ a-zA-Z0-9] +) – Samuel

+3

@gissolved es cierto, pero creo que el parámetro no puede comenzar con dígitos, y tal vez ni siquiera con un guion bajo Entonces usaría '@ ([a-zA-Z] [a-zA-Z0-9 _] *)'. – bluish

Cuestiones relacionadas