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

Mag*_*nus 12 c# sql clr user-defined-aggregate sql-server-2008

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

Value   Group
1       1
2       1
3       2
4       2
Run Code Online (Sandbox Code Playgroud)

使用查询

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
Run Code Online (Sandbox Code Playgroud)

会导致:

Concat  Group
"1,2"   1
"3,4"   2
Run Code Online (Sandbox Code Playgroud)

结果似乎总是正确和正如预期的那样,但是我遇到的这个页面表明订单不能保证,并且该属性SqlUserDefinedAggregateAttribute.IsInvariantToOrder仅保留供将来使用.

所以我的问题是:假设字符串中的连接值可以以任何顺序结束是否正确?
如果是这种情况,为什么MSDN页面上的示例代码使用该IsInvariantToOrder属性?

Mar*_*ell 5

我怀疑这里的一个大问题是你的声明"等同于查询" -但是,你的询问从来没有定义(而不能定义)由事物的顺序进行聚合(你当然可以订购团体,由具有ORDER BYGROUP BY).除此之外,我只能说它完全基于一个集合(而不是一个有序的序列),从技术上讲,这个顺序确实是未定义的.

  • @Magnus - 所有内在的`ORDER BY`给你的是`TOP`的声音定义.它*不以任何方式保证任何外部操作对行进行操作的顺序.实际上,人们习惯使用"TOP 100 PERCENT"和"ORDER BY"来"订购"视图 - 但随后优化器意识到如果需要100%的行,则不需要执行排序.如果内部查询尚未进行相同的优化,则可能在下一版本的SQL Server中执行. (2认同)
  • 如果他们在下一个版本中实现"优化",他们也可以实现`IsInvariantToOrder`来修复它. (2认同)