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