我正在使用来自 this MSDN page 的代码在 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
结果似乎总是如预期的那样正确,但比我遇到的要好 this page声明顺序不受保证,属性 SqlUserDefinedAggregateAttribute.IsInvariantToOrder
仅供将来使用。
所以我的问题是:假设字符串中的连接值可以以任何顺序结束是否正确?
如果是这样,那么为什么 MSDN 页面上的示例代码使用 IsInvariantToOrder
属性?
最佳答案
我怀疑这里的一个大问题是您的声明“与查询中的相同” - 但是,您的查询从不定义(也不能定义)订单正在聚合的事物(您当然可以通过在 GROUP BY
之后添加 ORDER BY
来对 groups 进行排序)。除此之外,我只能说它完全基于集合(而不是有序序列),而且技术上顺序确实是未定义的。
关于c# - SQL 用户定义的聚合值保留顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596919/