从存储过程返回逗号分隔的字符串列表

时间:2014-04-04 17:10:54

标签: sql-server tsql sql-server-2005

我正在尝试从存储过程返回逗号分隔的字符串列表,如下所示:

@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"

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Dynamic Sql有自己的作用域,在其作用域之外声明的任何变量对动态sql都不可见。你将第二个参数中的任何传递变量声明为sp_executesql,如果你希望存储和检索一个值该变量使用关键作品OUTPUTOUT将其作为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示例数据库,修改到您的架构。