Sql server 将行连接到单个列中

Sql server 将行连接到单个列中,sql-server,tsql,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 @Co

我已经将以下内容视为将多行的值连接成单个字符串的解决方案,但是我无法理解它实际上是如何工作的

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]

请您解释一下它是如何工作的,以及使用这种方法是否存在任何风险


提前感谢

最后一次编辑: 更新了我的解决方案以包含括号

这种方法的工作原理是将dbo.dice中的值附加到变量@concatString中。它不可靠;看见您可以在2017+上对XML路径或字符串_AGG使用
。这两种方法都很快。如果必须保证项目的顺序,则在对XML路径使用
时,必须包含ORDER BY<到目前为止,code>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;

谢谢你,艾伦,你是在建议我不要使用我发布的方法(它确实有效)。我真的想试着理解我发布的sql中字符串是如何构建的逻辑。是的,对不起,我只是粘贴了代码并删除了注释。见我更新的帖子。是的,这种方法不可靠(尽管我个人从来没有遇到过问题)。for XML PATH和STRING_AGG方法是goYou'r的方法,称为古怪的更新。上面有一个字母。这是可以使用的,而且速度非常快,但是有一些副作用,你必须知道,为了得到一个可靠的结果,需要提前清除一些条件。如果性能对您来说不是最重要的,请使用其他方法,如
for XML
STRING_AGG
(请参阅现有答案)。