Как выполнить запрос, если переданы как имя столбца, так и имя таблицы? - PullRequest
1 голос
/ 16 июня 2009

Учитывая имя таблицы и имя столбца в паре переменных, могу ли я выполнить запрос выбора без использования динамического sql?

например, я бы хотел что-то лучше , чем это:

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

Я бы хотел сделать это, потому что моя динамическая версия sql в 3 раза медленнее, чем не динамическая версия (которая не поддерживает программируемое имя таблицы / столбца, отсюда и этот вопрос).

Ответы [ 2 ]

2 голосов
/ 16 июня 2009

Динамическая версия будет в 3 раза медленнее, только потому, что вы будете обмениваться именами таблиц, а синтаксический анализатор не сможет оптимизировать для этого.

Возможно, вы захотите использовать своего рода оператор вложенного переключателя в своей подпрограмме и использовать его для выбора оператора SELECT из предопределенных таблиц / столбцов, особенно если ваша схема не будет часто изменяться. Это должно работать намного быстрее, но вы потеряете истинную динамичность.

1 голос
/ 16 июня 2009

Похоже, вопрос в том, можете ли вы создать и выполнить запрос во время выполнения без использования динамического SQL?

Я бы сказал, что ответ - нет. Выборы:

  • динамический SQL - вызов sp_ExecuteSQL или Exec() для заданной пользователем строки. Будь то сквозной SQL с использованием библиотеки ADO и объекта Command, или это прямо в sproc.
  • скомпилированный SQL - использование обычных объектов (sprocs и UDF) с известными хорошими утверждениями, взаимодействующими с известными хорошими объектами. В этом случае разбор выполняется заранее.
...