为非表变量分配多行

时间:2016-05-17 13:38:43

标签: sql-server

我想了解这里发生了什么(这个问题的答案之一:Concatenate many rows into a single text string?):

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name 
FROM People

所以我有一个模范表'测试'数据:

Col1
----
abc
xyz

现在我执行:

DECLARE @Concatenation VARCHAR(8000) 
SELECT @Concatenation = COALESCE(@Concatenation + ', ', '') + Col1 FROM test
Select @Concatenation

结果我得到了一个结果abc, xyz

如果我执行:

DECLARE @Concatenation VARCHAR(8000) 
SELECT @Concatenation = Col1 FROM test
Select @Concatenation

我得到一个结果xyz

问题是为什么像select @variable = @variable + column这样的作业导致@variable遍历整个列?如果我像select @variable = column这样做,那么该列的记录会被返回?随机?

1 个答案:

答案 0 :(得分:0)

这是你应该做的事情:

SELECT  STUFF(( SELECT  ',' + name
                FROM    People
              FOR
                XML PATH('')
              ), 1, 1, '')

你问题中的第一个例子是黑客攻击并且偶然起作用。请参阅以下主题:

https://connect.microsoft.com/SQLServer/Feedback/Details/383641

nvarchar concatenation / index / nvarchar(max) inexplicable behavior

第二个可能会返回任何值,因为您没有指定顺序。