Присвойте результат динамического sql переменной - PullRequest
42 голосов
/ 06 августа 2011

Я делаю динамический SQL для преобразования всех столбцов в таблице в строку

так ведь ведь я делаю

EXEC(@template); 

где @template - динамически сгенерированный запрос, поэтому:

col1  col2 col3
---------------
1    7    13 
2    8    14
3    9    15
4   10    16
5   11    17
6   12    18

(это результаты: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)

Как мне присвоить переменной результирующую строку

что-то вроде?

DECLARE  @result AS varchar(max);
 SET @result = EXEC(@template); 

Ответы [ 5 ]

59 голосов
/ 06 августа 2011

Вы можете использовать sp_executesql с выходным параметром.

declare @S nvarchar(max) = 'select @x = 1'

declare @xx int
set @xx = 0

exec sp_executesql @S, N'@x int out', @xx out

select @xx

Результат:

(No column name)
1

Редактировать

В моем примере @S вместо вашего @template. Как видите, я присваиваю значение @x, поэтому вам нужно изменить @template, чтобы он внутренне назначал строку через запятую для переменной, которую вы определили в своем втором аргументе, для sp_executesql. В моем образце N'@x int out'. Возможно, вам нужен выходной параметр varchar(max). Что-то вроде N'@Result varchar(max) out'

Вот еще один пример построения строки, разделенной запятыми, из master..spt_values ​​

declare @template nvarchar(max)
set @template = 
'select @Result += cast(number as varchar(10))+'',''
from master..spt_values
where type = ''P''
'

declare @CommaString varchar(max)
set @CommaString = ''

exec sp_executesql @template, N'@Result varchar(max) out', @CommaString out

select @CommaString
12 голосов
/ 06 августа 2011

Вы можете использовать sp_executesql вместо exec.Это позволяет вам указать выходной параметр.

declare @out_var varchar(max);
execute sp_executesql 
    N'select @out_var = ''hello world''', 
    N'@out_var varchar(max) OUTPUT', 
    @out_var = @out_var output;
select @out_var;

Это печатает "привет мир".

11 голосов
/ 23 июля 2014

В большинстве этих ответов в качестве решения этой проблемы используется sp_executesql .Я обнаружил, что при использовании sp_executesql есть некоторые ограничения, в которые я не буду вдаваться, но я хотел предложить альтернативу с использованием EXEC () .Я использую SQL Server 2008 и знаю, что некоторые объекты, которые я использую в этом сценарии, недоступны в более ранних версиях SQL Server, поэтому будьте осторожны.

DECLARE @CountResults TABLE (CountReturned INT)
DECLARE 
    @SqlStatement VARCHAR(8000) = 'SELECT COUNT(*) FROM table'
    , @Count INT

INSERT @CountResults
EXEC(@SqlStatement)

SET @Count = (SELECT CountReturned FROM @CountResults)
SELECT @Count
1 голос
/ 10 мая 2013

Пример выполнения строки SQL в хранимой процедуре:

(я использую это для сравнения количества записей в каждой таблице в качестве первой проверки для регрессионного теста в цикле курсора)

select @SqlQuery1 = N'select @CountResult1 = (select isnull(count(*),0) from ' + @DatabaseFirst+'.dbo.'+@ObjectName + ')'

execute sp_executesql    @SqlQuery1 , N'@CountResult1 int OUTPUT',     @CountResult1 = @CountResult1 output;
0 голосов
/ 05 февраля 2019

Вы должны попробовать это при получении значения SEQUENCE в переменной из динамической таблицы.

DECLARE @temp table (#temp varchar (MAX));
DECLARE @SeqID nvarchar(150);
DECLARE @Name varchar(150); 

SET @Name = (Select Name from table)
SET @SeqID = 'SELECT NEXT VALUE FOR '+ @Name + '_Sequence'
insert @temp exec (@SeqID)

SET @SeqID = (select * from @temp )
PRINT @SeqID

Результат:

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