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属性?

SQL用户定义保存的值的聚合顺序

我怀疑这里的一个大问题是您的语句"与查询相同"-然而,您的查询从不定义(并且不能定义)通过聚合的事物来定义(您当然可以对进行排序,通过在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/