SQL Server 2017 - Как передать параметр в SELECT внутри динамического SQL - PullRequest
0 голосов
/ 22 февраля 2019

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

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?

1 Ответ

0 голосов
/ 22 февраля 2019

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

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

фактическое значение внутри переменной @Name равно нулю.И согласно логике сервера 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) в качестве значения по умолчанию, это плохая практика иможет замедлить ваши запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...