我使用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
属性?
答案 0 :(得分:5)
我怀疑这里的一个大问题是您的陈述“与查询中的相同” - 但是,您的查询 从不 定义(并且无法定义)订单正在聚合的内容(您当然可以通过ORDER BY
之后的GROUP BY
订购群组。除此之外,我只能说它完全基于 set (而不是有序序列),并且技术上订单确实未定义。
答案 1 :(得分:0)
虽然接受的答案是正确的,但我想分享其他人可能觉得有用的解决方法。警告:它根本不涉及使用用户定义的聚合:)
下面的链接描述了仅使用SELECT语句和varchar变量构建连接的分隔列表的优雅方法。上行(对于此线程)是您可以指定处理行的顺序。缺点是你不能轻易地连接许多不同的行子集而不需要痛苦的迭代。
不完美,但对于我的用例是一个很好的解决方法。