将动态sql的结果分配给变量

时间:2011-08-06 17:41:22

标签: sql-server string

我正在使用动态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 个答案:

答案 0 :(得分:57)

您可以将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

答案 1 :(得分:11)

您可以使用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;

这会打印“你好世界”。

答案 2 :(得分:11)

这些答案中的大多数使用 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

答案 3 :(得分:1)

在存储过程中执行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;

答案 4 :(得分:0)

您应该在从动态表中的变量中获取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