c# - SQL 用户定义的聚合值保留顺序?

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

最佳答案

我怀疑这里的一个大问题是您的声明“与查询中的相同” - 但是,您的查询从不定义(也不能定义)订单正在聚合的事物(您当然可以通过在 GROUP BY 之后添加 ORDER BY 来对 groups 进行排序)。除此之外,我只能说它完全基于集合(而不是有序序列),而且技术上顺序确实是未定义的。

关于c# - SQL 用户定义的聚合值保留顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596919/

相关文章:

c# - 哪些文件类型可以使用 System.IO.File.ReadAllLines()

c# - 检查数据库记录映射中的空值

mysql - 在更大的模式上奇怪更好的 mysql 查询性能

sql - 检索表相交的标准SQL查询是什么?

sql - 替换SQL中的多个字符

sql - 在 sql server 2008 中使用带有列和行总数的数据透视表

node.js - 将 SQL Server 数据迁移到 Neo4j 并使两个数据库的数据保持同步

c# - .runsettings 中的部署项

c# - 我可以在我的独立进程中托管 RavenDB 吗?

mysql - 我已经走进了死胡同。 SQL查询获取最后回复的用户名和时间戳