¿Cómo puedo ejecutar una consulta cuando tanto el nombre de la columna y el nombre de la tabla se pasan en?

StackOverflow https://stackoverflow.com/questions/998374

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).

¿Fue útil?

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 o Exec() 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top