Назначить результат динамического 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);
Ответы
Ответ 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