¿Cómo puedo ejecutar una consulta cuando tanto el nombre de la columna y el nombre de la tabla se pasan en?
-
14-09-2019 - |
Pregunta
Dado un nombre de tabla y el nombre de la columna en un par de variables, puedo realizar una consulta de selección sin utilizar SQL dinámico?
Por ejemplo, me gustaría algo más agradable que esto:
CREATE PROCEDURE spTest (@table NVARCHAR(30), @column NVARCHAR(30)) AS
DECLARE @sql NVARCHAR(2000)
SELECT @sql = N'SELECT ' + @column + N' FROM ' + @table
PRINT @sql
EXEC sp_executesql @sql
Me gustaría hacer esto porque mi versión de SQL dinámico es 3 veces más lento que la versión no dinámica (que no soporta un nombre de tabla / columna programable, por lo tanto, esta cuestión).
Solución
La versión dinámica va a ser 3 veces más lento, únicamente porque Your'e va a ser el intercambio dentro y fuera del nombre de la tabla, y el analizador no puede optimizar para eso.
Es posible que desee utilizar una sentencia switch anidada de las clases en su rutina y usar eso para seleccionar la instrucción SELECT de predefinidos tablas / columnas, especialmente si su esquema no será cambiado con frecuencia. Eso debería funcionar un montón más rápido, pero si no se pierden la verdadera dinámica-dad.
Otros consejos
Así que suena la pregunta es si se puede construir y ejecutar una consulta en tiempo de ejecución sin necesidad de utilizar SQL dinámico?
Yo diría que la respuesta es no. Las opciones son:
- SQL dinámico - pidiendo
sp_ExecuteSQL
oExec()
Dada una cadena construida usuario. Si eso es SQL de paso a través el uso de una biblioteca de ADO y un objeto Command, o que es correcto dentro de un procedimiento almacenado. - compilados SQL - el uso de los objetos habituales (UDF) y procedimientos almacenados con buenas declaraciones conocidas que interactúan con objetos buenos conocidos. El análisis se realiza de antemano en este caso.