为什么SQL Server在指定ORDER BY子句时忽略字符串连接中的值

时间:2011-04-04 12:05:25

标签: sql sql-server sql-order-by concatenation

我有下表

Created    Comment
2010/10/10 Text1 
2010/11/11 Text2
2010/12/12 Text3

我需要将所有评论收集到单个字符串

SELECT  @Comment = COALESCE(@Comment, '')
   + CHAR(13) + CHAR(10) + CONVERT(NVARCHAR(30), [dbo].[Comment].[Created], 101) + ': ' + ISNULL([Comment].[Text], '')
    FROM Comment

如果没有订购,它按预期结束工作将返回所有评论。 但是在运行以下代码后,添加了 ORDER BY 子句:

SELECT  @Comment = COALESCE(@Comment, '')
   + CHAR(13) + CHAR(10) + CONVERT(NVARCHAR(30), [Created], 101) + ': ' + ISNULL([Text], '')
    FROM Comment
  ORDER BY Created

仅返回最后一条评论。 有没有人知道为什么ORDER BY导致串联中的奇怪结果?

PS:如果使用 FOR XML 子句而不是连接Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?,它可以正常工作。

1 个答案:

答案 0 :(得分:6)

因为您依赖于无证件的行为。

微软称“The correct behavior for an aggregate concatenation query is undefined.”。如果计算标量移动到计划中的错误位置,那么它就会停止工作!