【问题标题】:Convert SQL Server result set into string将 SQL Server 结果集转换为字符串
【发布时间】:2011-01-27 17:01:01
【问题描述】:

我在 SQL Server 中得到结果为

SELECT StudentId FROM Student WHERE condition = xyz

我得到像这样的输出

学生卡 1236 7656 8990 ...........

存储过程的输出参数是@studentId字符串,我希望return语句为

1236, 7656, 8990.

如何将输出转换为单个字符串?

我返回单列 [即。学生ID]

【问题讨论】:

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


    【解决方案1】:

    测试一下:

     DECLARE @result NVARCHAR(MAX)
    
     SELECT @result = STUFF(
                            (   SELECT ',' + CONVERT(NVARCHAR(20), StudentId) 
                                FROM Student 
                                WHERE condition = abc 
                                FOR xml path('')
                            )
                            , 1
                            , 1
                            , '')
    

    【讨论】:

    • 是一种享受。我必须替换我继承的数十个 while 循环,以便将电子邮件放入单个字符串中。
    【解决方案2】:
    DECLARE @result varchar(1000)
    
    SELECT @result = ISNULL(@result, '') + StudentId + ',' FROM Student WHERE condition = xyz
    
    select substring(@result, 0, len(@result) - 1) --trim extra "," at end
    

    【讨论】:

    • 我刚刚试过这段代码,它可以工作。稍作调整:选择 substring(@result, 1, len(@result) -1 ) 删除多余的 ","
    • 试过了,最后一行在 SQL Server 2008 中不能正常工作。substring(@result, 1, len(@result) ) 删除了尾随逗号,而上面的版本也删除了逗号之前的字符。 :)
    • 应该是substring(@result, 1, len(@result) - 1) msdn.microsoft.com/en-GB/library/ms187748.aspx
    • 如果 StudentId 来自非 varchar 列,您可能会遇到转换异常。您需要使用 CONCAT 函数进行正确的连接。请参阅下面的答案。
    【解决方案3】:

    使用COALESCE函数:

    DECLARE @StudentID VARCHAR(1000)
    SELECT @StudentID = COALESCE(@StudentID + ',', '') + StudentID
    FROM Student
    WHERE StudentID IS NOT NULL and Condition='XYZ'
    select @StudentID
    

    【讨论】:

    • 如果 StudentId 来自非 varchar 列,您可能会遇到转换异常。您需要使用 CONCAT 函数进行正确的连接。请参阅下面的答案。
    【解决方案4】:

    两个答案都有效,但别忘了初始化变量的值,默认为NULL,用T-SQL:

    NULL + "Any text" => NULL
    

    这是一个很常见的错误,别忘了!

    使用 ISNULL 函数也是个好主意:

    SELECT @result = @result + ISNULL(StudentId + ',', '') FROM Student
    

    【讨论】:

    • 对“两个答案”的引用有点无用,因为答案会四处移动并且不止 2 个。
    【解决方案5】:

    使用CONCAT函数避免转换错误:

    DECLARE @StudentID VARCHAR(1000)
    SELECT @StudentID = CONCAT(COALESCE(@StudentID + ',', ''), StudentID)
    FROM Student
    WHERE StudentID IS NOT NULL and Condition='XYZ'
    select @StudentID
    

    【讨论】:

      【解决方案6】:

      这适用于表中的 NULL 值,并且最后不需要子字符串操作。 COALESCE 不能很好地处理表中的 NULL 值(如果它们存在的话)。

      DECLARE @results VARCHAR(1000) = '' 
      SELECT @results = @results + 
                 ISNULL(CASE WHEN LEN(@results) = 0 THEN '' ELSE ',' END + [StudentId], '')
      FROM Student WHERE condition = xyz
      
      select @results
      

      【讨论】:

        【解决方案7】:

        brad.v 中的answer 不正确!它不会给你一个连接的字符串。

        这是正确的代码,几乎与brad.v 相似,但有一个重要的变化:

        DECLARE @results VarChar(1000)
          SELECT @results = CASE
             WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
             ELSE @results + ', ' + CONVERT( VarChar(20), [StudentId])
          END
        FROM Student WHERE condition = abc;
        

        看到区别了吗? :) brad.v 请修正你的答案,我无法纠正或评论它,因为我在这里的声誉为零。我想我可以在你修好之后把我的拿掉。谢谢!

        【讨论】:

          【解决方案8】:

          以下是 MySQL(不是 SQL Server)的解决方案,我无法在 mysql 的 stackoverflow 上轻松找到解决方案,所以我想也许这可以帮助某人......

          参考:https://forums.mysql.com/read.php?10,285268,285286#msg-285286

          原始查询...

          SELECT StudentId FROM Student WHERE condition = xyz

          原始结果集...

          StudentId
          1236
          7656
          8990
          

          带有 concat 的新查询...

          SELECT group_concat(concat_ws(',', StudentId) separator '; ') 
          FROM Student 
          WHERE condition = xyz
          

          concat 字符串结果集...

          StudentId
          1236; 7656; 8990
          

          注意:将“分隔符”更改为您想要的任何内容

          GLHF!

          【讨论】:

            【解决方案9】:

            或单个选择语句...

            DECLARE @results VarChar(1000)
            SELECT @results = CASE
                 WHEN @results IS NULL THEN CONVERT( VarChar(20), [StudentId])
                 ELSE ', ' + CONVERT( VarChar(20), [StudentId])
               END
            FROM Student WHERE condition = abc;
            

            【讨论】:

              【解决方案10】:

              在声明变量时赋值。

              DECLARE @result VARCHAR(1000) ='';
              
              SELECT @result = CAST(StudentId AS VARCHAR) + ',' FROM Student WHERE condition = xyz
              

              【讨论】:

                【解决方案11】:

                使用 STRING_AGG:

                SELECT STRING_AGG(sub.StudentId, ',') FROM  
                (select * from dbo.Students where Name = 'Test3') as sub
                

                如果你想使用例如 ORDER BY:

                SELECT STRING_AGG(sub.StudentId, ',') WITHIN GROUP(Order by StudentId) FROM  
                (select * from dbo.Students where Name = 'Test3') as sub
                

                【讨论】:

                  猜你喜欢
                  • 2013-04-12
                  • 2010-12-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-05-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多