sql server-将动态sql的结果分配给variab

我正在执行动态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); 
cMinor asked 2020-08-12T02:04:03Z
5个解决方案
64 votes

您可以将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
Mikael Eriksson answered 2020-08-12T02:04:28Z
13 votes

您可以使用exec而不是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;

打印“ hello world”。

Andomar answered 2020-08-12T02:04:57Z
12 votes

这些答案大多数都使用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
Adam answered 2020-08-12T02:05:18Z
1 votes

在存储过程中执行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;
Chris Maakal answered 2020-08-12T02:05:43Z
0 votes

您应该在从动态表的变量中获取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
Disha Sojitra answered 2020-08-12T02:06:08Z
translate from https://stackoverflow.com:/questions/6968512/assign-result-of-dynamic-sql-to-variable