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
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
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()
.
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. –
Sí, es un buen punto sobre los comentarios de SQL. –
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.
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
@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
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. –