将SQL Server结果集转换为字符串

时间:2011-01-27 17:01:01

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

我在SQL Server中获得结果

SELECT StudentId FROM Student WHERE condition = xyz

我得到了像

这样的输出
StudentId
1236

7656

8990
........

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

1236, 7656, 8990.

如何在单个字符串中转换输出?

我正在返回单列[即。 StudentId]

10 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:44)

测试一下:

 DECLARE @result NVARCHAR(MAX)

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

答案 2 :(得分:8)

使用COALESCE功能:

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

答案 3 :(得分:7)

两个答案都有效,但不要忘记初始化变量的值,默认为NULL并使用T-SQL:

NULL + "Any text" => NULL

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

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

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

答案 4 :(得分:1)

使用CONCAT功能可避免转换错误:

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

答案 5 :(得分:1)

以下是针对MySQL(而非SQL Server)的解决方案,我无法在mysql的stackoverflow上轻松找到针对此问题的解决方案,因此我认为这可能会对某人有所帮助...

ref: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!

答案 6 :(得分:0)

或单个选择声明......

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;

答案 7 :(得分:0)

这个与表中的NULL值一起使用,并且最后不需要子串操作。 COALESCE在表中没有很好地处理NULL值(如果它们在那里)。

-v /var/run/docker.sock:/var/run/docker.sock

答案 8 :(得分:0)

answer中的brad.v不正确!它不会为您提供串联的字符串。

这是正确的代码,几乎像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,请修正您的答案,我无法采取任何措施予以纠正或评论,因为我的声誉为零。我想我可以在修复您的问题后将其删除。谢谢!

答案 9 :(得分:0)

在声明变量时分配一个值。

DECLARE @result VARCHAR(1000) ='';

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