我正在尝试从存储过程返回逗号分隔的字符串列表,如下所示:
@Strings NVARCHAR(MAX) OUT
...
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'SELECT @Strings = COALESCE(@Strings + '', '','''') + CAST(Name AS NVARCHAR(MAX)) FROM ' + @BlaTableName + ' order by Name'
EXEC sp_executesql @Sql
但我明白了:
必须声明标量变量" @ Strings"
有什么想法吗?
答案 0 :(得分:2)
Dynamic Sql有自己的作用域,在其作用域之外声明的任何变量对动态sql都不可见。你将第二个参数中的任何传递变量声明为sp_executesql
,如果你希望存储和检索一个值该变量使用关键作品OUTPUT
或OUT
将其作为OUTPUT
变量传递。
在将它们连接成字符串时,还要在Sql Server对象名称周围使用QUOTENAME()
函数。保护您免受SQL注入攻击。
见下文......
DECLARE @Strings NVARCHAR(MAX);
DECLARE @Sql NVARCHAR(MAX);
DECLARE @BlaTableName NVARCHAR(128) = N'Table_Name'
SET @Sql = N'SELECT @Strings = COALESCE(@Strings + '','', '''','''') + CAST(Name AS NVARCHAR(MAX))
FROM ' + QUOTENAME(@BlaTableName) + N' order by Name'
EXEC sp_executesql @Sql
,N'@Strings NVARCHAR(MAX) OUT' --<-- you need to declare variable here
,@Strings OUTPUT
SELECT @Strings --<-- Test it
答案 1 :(得分:1)
首先,使用FOR XML PATH方法连接字符串,
其次,您需要一个OUTPUT参数才能使其工作:
declare @strings nvarchar(max)
declare @BlaTableName sysname = 'customer';
declare @Sql nvarchar(max);
set @sql = '
select @strings=substring(col_list, 1, len(col_list)-1)
from (
select column_name + '', '' as [text()]
from information_schema.columns
where table_name = ''' + @BlaTableName + '''
order by ordinal_position
for xml path('''')) x(col_list)
'
exec sp_executesql
@sql,
N'@strings nvarchar(max) out',
@strings out
select @strings
这是使用AdventureWorks2012示例数据库,修改到您的架构。