No hay nada de malo en usar SQL dinámico si es necesario. De hecho, en algunas circunstancias es la única opción que tiene. Es más recomendable no usarlo, ya que sí, puede conducir a una inyección de SQL si su entrada no se desinfecta, y sí, usar SQL dinámico en los módulos que se llaman a menudo puede ser perjudicial para su rendimiento.
No creo que haya un ejemplo concreto en sí mismo, pero diría esto: intente lograr lo que es después de usar consultas y declaraciones regulares primero, solo luego de que haya agotado todas las demás vías, hágalo dinámicamente. Solo recuerde que la ejecución de una cadena dinámica de SQL se realiza en una sesión de usuario separada para el módulo que lo está llamando, por lo que puede encontrar problemas de permisos donde no espera ninguno.
Si te preocupa el rendimiento; Pruébalo. Si te preocupa la seguridad; validar su entrada. No hay correcto o incorrecto, solo que use su mejor criterio en función de la información y las herramientas que tenga disponibles en ese momento.
Es como la mayoría de las funciones de dbms, si lo usa en la situación correcta, funciona bien, la situación incorrecta lo hace mal.
Pros: Algunas cosas simplemente no se pueden hacer sin ella. Por lo general, solo he encontrado que esto es para el trabajo administrativo, y no para el código de la aplicación. Algunos comandos del sistema no permiten que los parámetros se utilicen como entrada. Entonces, por ejemplo, si necesito ejecutar algo a través de un sproc en cada base de datos, en muchas instancias con bases de datos desconocidas, y el comando no acepta parámetros, generalmente lo resuelvo a través de SQL dinámico. Sin embargo, esto es más importante en Sybase ASE que en MSSQL.
Contras: no voy a entrar mucho en eso, ya que creo que todos ya lo sabemos, pero puede haber algún riesgo para la inyección de SQL si se usa incorrectamente. El más grande para mí es que la consulta se tratará como lo que es, una consulta ad hoc única y no formará parte del plan de consulta compilado. Para algo que se ejecuta ocasionalmente, no es gran cosa. Para algo que se ejecuta cientos de veces por minuto y que va a tener una gran cantidad de sql únicos, generaría muchos planes de consulta nuevos y potencialmente innecesarios, consumiendo ciclos y acortando el tiempo válido del caché del plan.
fuente
No use SQL dinámico.
El 99% del tiempo se usa Dynamic SQL debido a la falta de conocimiento sobre cómo usar parámetros opcionales en procedimientos almacenados, el resto el 1% del tiempo se usa para crear una consulta altamente compleja para un informe que el cliente no comprende incluso. The Curse and Blessings of Dynamic SQL no muestra un ejemplo de por qué sería una buena idea usarlo, solo sugiere que es problemático porque aumenta la complejidad de la depuración, el mantenimiento, sin mencionar los riesgos de seguridad de SQL Inyección, bajo rendimiento no porque el caché sino las malas prácticas que conlleva, como el uso de tablas y cursores temporales que, por supuesto, son flojos e ingenuos.programador abusaría de. No existe la flexibilidad para escribir consultas de esa manera, SQL es un lenguaje declarativo y debe tratarse como tal.
La pereza es la raíz de todo mal.
Paradójicamente, esta respuesta se clasificará entre las más rechazadas .
fuente