SQL用户定义保存的值的聚合顺序
本文关键字:顺序 SQL 定义 保存 用户 | 更新日期: 2023-09-27 18:01:25
我使用这个MSDN页面的代码来创建一个用户定义的聚合来连接SQL server中的group by's
字符串。我的要求之一是,连接值的顺序与查询中的顺序相同。例如:
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
属性?
我怀疑这里的一个大问题是您的语句"与查询相同"-然而,您的查询从不定义(并且不能定义)通过聚合的事物来定义(您当然可以对组进行排序,通过在GROUP BY
之后使用ORDER BY
)。除此之外,我只能说它纯粹基于集合(而不是有序序列),并且技术上的顺序确实是未定义的。
虽然公认的答案是正确的,但我想分享一个其他人可能会觉得有用的解决方法。警告:它根本没有使用用户定义的聚合:)
下面的链接描述了一种仅使用SELECT语句和varchar变量构建连接的分隔列表的优雅方法。(对于这个线程)的好处是,您可以指定处理行的顺序。缺点是,如果不进行痛苦的迭代,就不能轻松地连接许多不同的行子集。
不完美,但对于我的用例来说是一个很好的解决方法。
http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/