c# - OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?

标签 c# sql sqlclr

前言 我一直在研究一个概念,我在下面发布的是我一直在尝试的内容的简化版本。如果您看着它并认为“那样做没有任何意义”,那可能是因为我没有任何意义 - 可能有更有效的方法来做到这一点。我只是想尝试一下,因为它看起来很有趣。

我正在尝试使用类似逆波兰式的实现在 SQL 中使用 CLR 自定义聚合来计算任意计算。我正在使用数据:

K | Amt | Instruction | Order
--+-----+-------------+------
A | 100 |        Push |     1
A |   1 |    Multiply |     2
A |  10 |        Push |     3
A |   2 |    Multiply |     4
A |     |         Add |     5
A |   1 |        Push |     6
A |   3 |    Multiply |     7
A |     |         Add |     8

计算的结果应该是123 ( = (100 * 1) + (10 * 2) + (1 * 3) )

使用以下 SQL(以及我编写的 CLR 函数 ReversePolishAggregateToReversePolishArguments*)我可以获得正确的结果:

SELECT K
  , dbo.ReversePolishAggregate(dbo.ToReversePolishArguments(Instruction, Amt))
FROM dbo.ReversePolishCalculation
GROUP BY K;

问题 我想通过将说明和顺序放在单独的表中来进一步概括解决方案,以便我可以对任意数据创建计算。例如,我在想这样的表格:

Item |     Type | Amount
-----+----------+-------
   A | Budgeted |     10
   A |   Actual |     12
   B |   Actual |     20
   B | Budgeted |     18

并把它加入到这样的计算表中

    Type | Instruction | Order
---------+-------------+------
Budgeted |        Push |     1
  Actual |       Minus |     2

计算每个项目是超出预算还是低于预算。重要的考虑是减号是不可交换的,所以我需要指定顺序以确保从预算金额中减去实际金额,而不是相反。我希望我能够使用聚合的 OVER 子句中的 ORDER BY 子句来做到这一点(然后稍微调整一下结果)。

SELECT K
  , dbo.[ReversePolishAggregate](
    dbo.[ToReversePolishArguments](Instruction, Amt)) 
    OVER (PARTITION BY K ORDER by [Order])
FROM dbo.ReversePolishCalculation;

但是我得到了错误:

Incorrect syntax near the keyword 'ORDER'.

我已经通过运行以下 SQL 语句检查了语法

SELECT K
  , SUM(Amt) OVER (PARTITION BY K ORDER BY [Order])
FROM dbo.ReversePolishCalculation;

这工作正常(它解析并运行,尽管我不确定结果是否有意义),所以我假设这是自定义 CLR 聚合或函数的问题。

我的问题 这应该有效吗?是否有任何文档明确说明不支持此功能?我的语法正确吗?

我使用的是 Visual Studio 2012 Premium、SQL Server Management Studio 2012 和 .NET Framework 4.0。

* 我创建了 2 个 CLR 函数作为无法将多个参数传递到单个聚合函数的变通方法 - 参见 this article .

编辑:This post看起来它不受支持,但我希望有一些更官方的东西。

最佳答案

作为回答:

微软官方,没有。

http://connect.microsoft.com/SQLServer/feedback/details/611026/add-support-for-over-order-by-for-clr-aggregate-functions

它似乎没有进入 2014(或 2016 CTP 3)......没有提到许多 transact-sql 更改:

http://msdn.microsoft.com/en-us/library/bb510411.aspx#TSQL

关于c# - OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165879/

相关文章:

c# - ASP.NET Core Web API - 如何解决 Serilog 和 Microsoft.Extensions.Logging 之间的冲突

c# 通过outlook 2013发送html电子邮件

sql - 如何从SQL Server数据库获取所有触发环境

sql-server - 以相当安全的方式使用 sqlclr 和脚本程序集的 F#

sql-server - 从 SQL CLR 程序集访问 FILESTREAM

c# - 在 C# 中,具有局部作用域的对象是否使用堆栈?

c# - 当系统处于休眠状态时,Windows 服务中的计时器如何运行?

mysql - mysql 中的行解释是否意味着该表没有正确索引?

sql - 在PostgreSQL中,我们可以直接比较两个带有不同时区的时间戳吗?

c# - 在 SQL Server CLR 存储过程中运行进程但 Process.OutputDataReceived 未触发