Как я могу выполнить запрос, если переданы и имя столбца, и имя таблицы?
-
14-09-2019 - |
Вопрос
Учитывая имя таблицы и имя столбца в паре переменных, могу ли я выполнить запрос выбора без использования динамического 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) с заведомо исправными операторами, взаимодействующими с заведомо исправными объектами.В этом случае анализ выполняется заранее.