Como puede ver, la pregunta "por qué" requiere un tipo diferente de respuesta, que incluye la justificación histórica y los supuestos subyacentes para el lenguaje, no estoy seguro de que realmente pueda hacer esa justicia.
Este completo artículo del MVP de SQL Erland Sommarskog intenta proporcionar algunos fundamentos, junto con la mecánica:
La maldición y las bendiciones del SQL dinámico :
Planes de consulta de almacenamiento en caché
Cada consulta que ejecuta en SQL Server requiere un plan de consulta. Cuando ejecuta una consulta por primera vez, SQL Server crea un plan de consulta para ella, o según la terminología, compila la consulta. SQL Server guarda el plan en caché y la próxima vez que ejecute la consulta, el plan se reutiliza.
Esto (y la seguridad, ver más abajo) es probablemente la razón más importante.
SQL opera bajo la premisa de que las consultas no son operaciones únicas, sino que se utilizarán una y otra vez. Si la tabla (¡o la base de datos!) No se especifica realmente en la consulta, no tiene forma de generar y guardar un plan de ejecución para uso futuro.
Sí, no todas las consultas que ejecutamos se reutilizarán, pero esta es la premisa operativa predeterminada de SQL , por lo que las "excepciones" deben ser excepcionales.
Algunas otras razones que Erland enumera (tenga en cuenta que enumera explícitamente las ventajas de usar procedimientos almacenados , pero muchas de estas también son ventajas de consultas parametrizadas (no dinámicas)):
- El sistema de permisos : el motor SQL no puede predecir si tiene los derechos para ejecutar una consulta si no conoce la tabla (o base de datos) con la que va a operar. Las "cadenas de permisos" que usan SQL dinámico son un fastidio.
- Reducción del tráfico de red : pasar el nombre del proceso almacenado y algunos valores de parámetros a través de la red es más corto que una declaración de consulta larga.
- Lógica de encapsulación : debe estar familiarizado con las ventajas de encapsular la lógica de otros entornos de programación.
- Seguimiento de lo que se usa : si necesito cambiar la definición de una columna, ¿cómo puedo encontrar todo el código que la llama? Los procedimientos del sistema existen para encontrar dependencias dentro de una base de datos SQL, pero solo si el código está en procedimientos almacenados.
- Facilidad de escritura del código SQL : la verificación de sintaxis se produce al crear o modificar un procedimiento almacenado, por lo que es de esperar que se produzcan menos errores.
- Abordar errores y problemas : un DBA puede rastrear y medir el rendimiento de los procedimientos almacenados individuales mucho más fácilmente que el SQL dinámico que cambia constantemente.
Una vez más, cada uno de estos tiene un centenar de matices en los que no entraré aquí.