12

我使用此 MSDN 页面中的代码创建用户定义的聚合以group by's在 SQL 服务器中连接字符串。我的要求之一是连接值的顺序与查询中的顺序相同。例如:

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

4

2 回答 2

5

我怀疑这里的一个大问题是您的陈述“与查询中的相同”-但是,您的查询从未定义(也无法定义)被聚合的事物的顺序(您当然可以通过ORDER BYGROUP BY)。除此之外,我只能说它纯粹基于一个集合(而不是有序序列),而且从技术上讲,这个顺序确实是未定义的。

于 2011-07-06T13:19:51.567 回答
0

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

下面的链接描述了一种仅使用 SELECT 语句和 varchar 变量来构建连接的分隔列表的优雅方法。好处(对于这个线程)是您可以指定处理行的顺序。不利的一面是,如果不进行痛苦的迭代,您将无法轻松地连接许多不同的行子集。

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

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

于 2014-02-11T23:39:50.240 回答