Почему SQL Server игнорирует пустые места в конкатенации строк, когда указано предложение ORDER BY - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть следующая таблица

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 для «объединения» нескольких строк из подзапроса в одно поле с разделителями? .

1 Ответ

6 голосов
/ 04 апреля 2011

Потому что вы полагаетесь на недокументированное поведение.

Microsoft говорит: " Правильное поведение для запроса совокупной конкатенации не определено. ". Если вычислительный скаляр переместится в неправильное место на плане, он просто перестанет работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...