Сохранен ли пользовательский совокупный порядок сохраненных значений 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
?
Ответы
Ответ 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/