Подтвердить что ты не робот

Сохранен ли пользовательский совокупный порядок сохраненных значений SQL?

Im, используя код этой страницы MSDN, чтобы создать агрегат, определенный пользователем, для объединения строк с group by's в SQL-сервере. Одним из моих требований является то, что порядок конкатенированных значений такой же, как в запросе. Например:

Value   Group
1       1
2       1
3       2
4       2

Использование запроса

SELECT
  dbo.Concat(tbl.Value) As Concat,
  tbl.Group
FROM
  (SELECT TOP 1000
     tblTest.*
  FROM 
    tblTest
  ORDER BY 
    tblTest.Value) As tbl
GROUP BY
  tbl.Group

Результат:

Concat  Group
"1,2"   1
"3,4"   2

Результат кажется всегда правильным и ожидаемым, но чем я натолкнулся на эту страницу, в котором говорится, что заказ не гарантирован и что атрибут SqlUserDefinedAggregateAttribute.IsInvariantToOrder зарезервирован только для использования в будущем.

Итак, мой вопрос: правильно ли предположить, что конкатенированные значения в строке могут закончиться в любом порядке? Если это так, то почему код примера на странице MSDN использует атрибут IsInvariantToOrder?

4b9b3361

Ответ 1

Я подозреваю, что большая проблема заключается в том, что ваш оператор "такой же, как и в запросе", однако ваш запрос никогда не определяет (и не может определить) порядок агрегированными вещами (вы можете курс упорядочивает группы, имея ORDER BY после GROUP BY). Помимо этого я могу только сказать, что он основан исключительно на множестве (а не на упорядоченной последовательности), и что технически порядок действительно undefined.

Ответ 2

Хотя принятый ответ верен, я хотел бы поделиться обходным решением, которое другие могут найти полезным. Предупреждение: в нем не используется полностью определенный пользователем агрегат:)

В приведенной ниже ссылке описывается элегантный способ создания объединенного, ограниченного списка с использованием только инструкции SELECT и переменной varchar. Потенциал роста (для этого потока) заключается в том, что вы можете указать порядок обработки строк. Недостатком является то, что вы не можете легко объединиться во множестве разных подмножеств строк без болезненной итерации.

Не идеально, но для моего случая использования было хорошим обходом.

http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/