Подтвердить что ты не робот

Назначить результат динамического sql переменной

Я делаю динамический 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); 
4b9b3361

Ответ 1

Вы можете использовать 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

Edit

В моем примере @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

Ответ 2

Вы можете использовать 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;

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

Ответ 3

Большинство этих ответов используют sp_executesql как решение этой проблемы. Я обнаружил, что есть некоторые ограничения при использовании sp_executesql, в которые я не буду входить, но я хотел предложить альтернативу, используя EXEC(). Я использую SQL Server 2008, и я знаю, что некоторые из объектов, которые я использую в этом script, недоступны в более ранних версиях 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

Ответ 4

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

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

select @SqlQuery1 = N'select @CountResult1 = (select isnull(count(*),0) from ' + @DatabaseFirst+'.dbo.'[email protected] + ')'

execute sp_executesql    @SqlQuery1 , N'@CountResult1 int OUTPUT',     @CountResult1 = @CountResult1 output;

Ответ 5

Вы должны попробовать это при получении значения 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