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

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

Вопрос

Учитывая имя таблицы и имя столбца в паре переменных, могу ли я выполнить запрос выбора без использования динамического 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 раза медленнее, чем нединамическая версия (которая не поддерживает программируемое имя таблицы/столбца, отсюда и этот вопрос).

Это было полезно?

Решение

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

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

Другие советы

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

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

  • динамический SQL - вызов sp_ExecuteSQL или Exec() задана строка, созданная пользователем.Будь то сквозной SQL с использованием библиотеки ADO и объекта Command или прямо внутри процедуры.
  • скомпилированный SQL — с использованием обычных объектов (sprocs и UDF) с заведомо исправными операторами, взаимодействующими с заведомо исправными объектами.В этом случае анализ выполняется заранее.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top