Skip to content

Еще одна причина, по которой я люблю динамический SQL: параметры OUTPUT могут быть входными параметрами

Пересказ статьи Erik Darling. Another Reason Why I Love Dynamic SQL: OUTPUT Parameters Can Be Input Parameters


За годы было много написано о динамическом SQL, но недавно я столкнулся с ситуацией, когда мне понадобилось переписать один код с минимальным воздействием на другие части хранимой процедуры.

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

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 в качестве параметра.

Умопомрачительно.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

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