Еще одна причина, по которой я люблю динамический SQL: параметры OUTPUT могут быть входными параметрами
Пересказ статьи Erik Darling. Another Reason Why I Love Dynamic SQL: OUTPUT Parameters Can Be Input Parameters
За годы было много написано о динамическом SQL, но недавно я столкнулся с ситуацией, когда мне понадобилось переписать один код с минимальным воздействием на другие части хранимой процедуры.
Требовалось установить ряд переменных в значения столбцов таблицы, но загвоздка заключалась в том, что некоторые значения, которые требовалось установить, также необходимо было передать в качестве аргументов поиска.
Вот реальный упрощенный пример:
Это результат:
Поскольку мы объявляем @i вне динамического SQL и устанавливаем в 4, это называется внешней областью видимости.
Когда мы выполняем динамический SQL, то сообщаем ему ожидать параметр @i, поэтому нам не нужно объявлять отдельную переменную для этого внутри.
Мы также говорим блоку динамического SQL, что мы ожидаем на выходе новое значение для @i.
Хотя мы также передаем @i в качестве параметра.
Умопомрачительно.
DECLARE
@i int = 4,
@s nvarchar(MAX) = N'';
SET
@s += N'
SELECT TOP (1)
@i = d.database_id
FROM sys.databases AS d
WHERE d.database_id > @i
ORDER BY d.database_id;
'
EXEC sys.sp_executesql
@s,
N'@i INT OUTPUT',
@i OUTPUT;
SELECT
@i AS input_output;
Это результат:
Поскольку мы объявляем @i вне динамического SQL и устанавливаем в 4, это называется внешней областью видимости.
Когда мы выполняем динамический SQL, то сообщаем ему ожидать параметр @i, поэтому нам не нужно объявлять отдельную переменную для этого внутри.
Мы также говорим блоку динамического SQL, что мы ожидаем на выходе новое значение для @i.
Хотя мы также передаем @i в качестве параметра.
Умопомрачительно.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой