【问题标题】:Return a comma separated list of strings from a stored procedure从存储过程中返回逗号分隔的字符串列表
【发布时间】:2014-04-04 17:10:53
【问题描述】:

我试图从这样的存储过程中返回一个逗号分隔的字符串列表:

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

有什么想法吗?

【问题讨论】:

  • @Strings 超出了sp_executesql 的范围内
  • fwiw,通过返回一个集合并在客户端应用程序中创建逗号分隔列表,您将获得更好的结果

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


【解决方案1】:

Dynamic Sql 有自己的作用域,在其作用域之外声明的任何变量对动态 sql 都不可见,您将在第二个参数中的任何传递变量声明为 sp_executesql,并且如果您希望从该变量中存储和检索值使用密钥OUTOUTPUT 将其作为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

【讨论】:

    【解决方案2】:

    首先,使用 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 示例数据库,修改为您的架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多