将行合并为单列

时间:2018-10-30 03:28:44

标签: sql-server tsql

我已经将以下内容视为将多个行的值连接到单个字符串中的解决方案,但是我不明白它的实际工作原理。

DECLARE @ConcatString nvarchar(max);

SELECT @ConcatString = COALESCE(@ConcatString + ', ['+ cast([Dice1] as 
nvarchar(10)) + ']', '['+ cast([Dice1] as nvarchar(10)) + ']')
FROM  [dbo].[Dice]

SELECT @ConcatString

输出:[1],[2],[3],[4],[5],[6]

请您说明一下该方法的工作原理,以及使用此方法是否存在任何风险。

预先感谢

1 个答案:

答案 0 :(得分:2)

最终修改: 更新了我的解决方案,以包括括号。

该方法通过将dbo.dice中的值附加到变量@concatString上而起作用。这不可靠;参见this article。您可以在2017年起使用FOR XML PATHSTRING_AGG。两种方法都很讨厌。使用FOR XML PATH时,如果必须保证项目顺序,则必须包括ORDER BY。到目前为止,STRING_AGG是我最喜欢的方法。

-- Sample data
DECLARE @dice TABLE (dice1 TINYINT);
INSERT @dice(dice1)
VALUES(1),(2),(3),(4),(5),(6);

-- Solution #1: FOR XML PATH
SELECT newString = STUFF((
SELECT   ',('+CAST(d.dice1 AS VARCHAR(8000))+')'
FROM     @dice AS d
ORDER BY d.dice1
FOR XML PATH('')),1,1,'');

-- Solution #2: STRING_AGG (SQL 2017+)
SELECT newString = STRING_AGG(CONCAT('(',d.dice1,')'),',') WITHIN GROUP (ORDER BY d.dice1)
FROM     @dice AS d;