SQL Server 2017 — как передать параметр в SELECT внутри динамического SQL

Я создал следующую таблицу:

CREATE TABLE TestABC (
  colID INT NOT NULL,
  colName VARCHAR(10) NULL,
  );

INSERT INTO TestABC 
    (colID, colName) 
VALUES 
    (1,'ABC'),
    (2,'DEF'),
    (3,'GHI');

Когда я запускаю следующий запрос к приведенной выше таблице...

DECLARE @Name varchar(max)
select @Name = colName from dbo.TestABC where colID = '3'
print @Name

Я получаю следующий ожидаемый результат, что хорошо:

GHI

Теперь я пытаюсь передать SELECT с моим параметром @Name внутри динамического SQL:

DECLARE @sql varchar(max)
DECLARE @Name varchar(max)
set @sql = '
select ' + @Name + ' = colName from dbo.TestABC where colID = ''3''
'
print @sql

Проблема, с которой я сталкиваюсь, заключается в том, что внутри динамического SQL мой параметр @Name не оценивается и приводит к пустому или NULL. Кроме того, весь мой динамический параметр sql @sql также заканчивается NULL.

Я полностью понимаю, что если я добавлю следующую дополнительную строку перед моим динамическим SQL, то @Name должен быть правильно оценен...

SELECT @Name = colName from dbo.TestABC

Однако это не моя цель. Мне нужно, чтобы SELECT был полностью динамическим, так как в конечном итоге я буду передавать свой dbo.TestABC динамически. Поэтому я не могу предварительно назначить параметр @Name, как в приведенном выше SELECT.

Как мне заполнить параметры @Name и @sql в моем SELECT внутри моего динамического SQL?


person shawnmandel    schedule 22.02.2019    source источник
comment
Почему это должно быть динамичным? В этом утверждении нет ничего динамического, если вы пытаетесь выполнить задание. Чтобы ответить, почему вы получаете NULL, это потому, что ваше выражение оценивается как set @sql = 'select ' + NULL + ' = colName from dbo.TestABC where colID = ''3''' и объединяет NULL в строку = NULL.   -  person Larnu    schedule 22.02.2019
comment
@Larnu, он должен быть динамическим, так как я буду динамически передавать свою таблицу в своей общей логике.   -  person shawnmandel    schedule 22.02.2019
comment
Возможно, тогда было бы лучше включить вашу полную логику? :)   -  person Larnu    schedule 22.02.2019


Ответы (1)


когда вы делаете:

set @sql = '
select ' + @Name + ' = colName from dbo.TestABC where colID = ''3''
'

фактическое значение внутри переменной @Name равно null. И в соответствии с логикой сервера sql строка + null равна нулю.

чтобы делать то, что вы хотите, вам нужно:

DECLARE @sql nvarchar(max)
DECLARE @Name nvarchar(max)
set @sql = '
select @someVariable = colName from dbo.TestABC where colID = ''3''
'
EXECUTE sp_executesql @sql, N'@someVariable varchar(max) OUTPUT', @someVariable = @Name OUTPUT;
select @Name; -- this will print your colName

и не используйте (max) по умолчанию, это плохая практика и может замедлить ваши запросы.

person Rafal    schedule 22.02.2019
comment
как мне использовать или объявить мой выходной параметр в вашем примере? - person shawnmandel; 22.02.2019