一尘不染

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

sql

我有下表

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 子句代替串联,则可以很好地工作。是否有一种方法可以创建SQL
Server函数,以将子查询中的多行“填充”到单个定界字段中?


阅读 170

收藏
2021-03-10

共1个答案

一尘不染

因为您依赖未记录的行为。

Microsoft说“未定义聚合级联查询的正确行为。
”。如果计算标量移到计划中的错误位置,则它将停止工作!

2021-03-10