SQL用户定义的值的聚合顺序是否保留?

时间:2011-07-06 13:11:10

标签: c# sql sql-server-2008 clr user-defined-aggregate

我使用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属性?

2 个答案:

答案 0 :(得分:5)

我怀疑这里的一个大问题是您的陈述“与查询中的相同” - 但是,您的查询 从不 定义(并且无法定义)订单正在聚合的内容(您当然可以通过ORDER BY之后的GROUP BY订购群组。除此之外,我只能说它完全基于 set (而不是有序序列),并且技术上订单确实未定义。

答案 1 :(得分:0)

虽然接受的答案是正确的,但我想分享其他人可能觉得有用的解决方法。警告:它根本不涉及使用用户定义的聚合:)

下面的链接描述了仅使用SELECT语句和varchar变量构建连接的分隔列表的优雅方法。上行(对于此线程)是您可以指定处理行的顺序。缺点是你不能轻易地连接许多不同的行子集而不需要痛苦的迭代。

不完美,但对于我的用例是一个很好的解决方法。

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