Perdóname, soy un desarrollador que se ha mudado al mundo de SQL. Pensé que podría mejorar algunos SQL agregando variables, pero no funcionó como esperaba. ¿Alguien puede decirme por qué esto no funciona? No quiero una solución, quiero saber las razones por las que esto no funciona como imagino que debería, ya que estoy seguro de que hay una buena razón, pero actualmente no me sorprende.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
gareth
fuente
fuente
USE
comando con un parámetro.GO
, la variable declarada previamente desaparece. Es posible que desee analizar las variables SQLCMD, que pueden o no ser aplicables a su escenario.Respuestas:
Por la página de libros en línea para variables
Funcionaría de la manera que esperaba si, por ejemplo, usara su variable en una cláusula where. En cuanto a por qué, creo que tiene algo que ver con el analizador no capaz de evaluar la variable y, por lo tanto, verificar su existencia. Al ejecutar, la consulta se analiza primero para la sintaxis y los objetos y luego, si el análisis es exitoso, la consulta se ejecuta en ese punto, la variable se establecería.
fuente
eval
funciones en lenguajes de procedimiento como JavaScript y Python. Es una forma rápida de crear agujeros de seguridad.Las limitaciones en el uso de variables en las declaraciones SQL surgen de la arquitectura de SQL.
Hay tres fases en el procesamiento de una declaración SQL:
El servidor SQL oculta el paso de preparación del programador y lo ejecuta mucho más rápido que las bases de datos más tradicionales como Oracle y DB2. Es por razones de rendimiento que SQL pasa potencialmente mucho tiempo determinando un plan de ejecución óptimo, pero solo lo hace la primera vez que se encuentra la declaración después de un reinicio.
Por lo tanto, en SQL estático , las variables solo se pueden usar en lugares donde no invaliden el plan de ejecución, por lo que no para nombres de tablas, nombres de columnas (incluidos los nombres de columnas en condiciones WHERE), etc.
El SQL dinámico existe para los casos en los que no se pueden evitar las restricciones, y el programador sabe que la ejecución tardará un poco más. El SQL dinámico puede ser vulnerable a la inyección de código malicioso, ¡así que tenga cuidado!
fuente
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 :
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)):
Una vez más, cada uno de estos tiene un centenar de matices en los que no entraré aquí.
fuente
Necesitas usar sql dinámico
a continuación se muestra la salida de impresión ... una vez que elimine el comentario,
exec sp_executesql @sqltext
las declaraciones se ejecutarán realmente ...fuente