C# SQL ORDER BY IN OVER子句与CLR聚合不兼容?
序言 我一直在研究一个概念,我在下面发布的是我一直在尝试的精简版本。如果你看着它并认为“那样做没有任何意义”,那么可能是因为我没有任何意义——可能有更有效的方法来做这件事。我只是想试试这个,因为它看起来很有趣 我试图做的是,在SQL中使用CLR自定义聚合,并使用类似于反向波兰语的实现来计算任意计算。我正在使用数据:C# SQL ORDER BY IN OVER子句与CLR聚合不兼容?,c#,sql,sqlclr,C#,Sql,Sqlclr,序言 我一直在研究一个概念,我在下面发布的是我一直在尝试的精简版本。如果你看着它并认为“那样做没有任何意义”,那么可能是因为我没有任何意义——可能有更有效的方法来做这件事。我只是想试试这个,因为它看起来很有趣 我试图做的是,在SQL中使用CLR自定义聚合,并使用类似于反向波兰语的实现来计算任意计算。我正在使用数据: K | Amt | Instruction | Order --+-----+-------------+------ A | 100 | Push | 1 A
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函数ReversePolishAggregate
和toreReversePolishArguments
*可以得到正确的结果:
选择K
,dbo.ReversePolishAggregate(dbo.toreReversePolishArguments(指令,金额))
从dbo.reversePolish计算
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
子句中的orderby
子句来实现这一点(然后再稍微调整该结果)
选择K
,dbo.[反向聚合](
dbo.[ToReversePolishArguments](指令,Amt))
OVER(按K顺序按[ORDER]划分)
从dbo.reversepolish计算;
但是我得到了一个错误:
关键字“ORDER”附近的语法不正确
我已经通过运行以下SQL语句检查了语法
选择K
,总和(金额)超过(按K顺序除以[顺序])
从dbo.reversepolish计算;
这很好(它解析并运行,尽管我不确定结果是否有意义),因此我假设这是自定义CLR聚合或函数的问题
我的问题这样行吗?是否有任何文档明确表示不支持此操作?我的语法正确吗
我正在使用Visual Studio 2012 Premium、SQL Server Management Studio 2012和.NET framework 4.0
*我创建了2个CLR函数,作为解决无法将多个参数传递到单个聚合函数中的问题的方法-请参阅
编辑:看起来它不受支持,但我希望它更正式一点。作为回答:
微软的官方消息,没有
它似乎没有进入2014年(或2016年CTP 3)。。。未提及许多transact-sql更改:
在您链接的帖子底部,似乎有一个“官方”更新:“我的连接项目反馈(很快…)是SQLCLR UDAs上的窗口“在Denali上没有切分。也许下次吧。”。请参见下面的答案:-这样看起来您可以使用,但可能不是按顺序……你能用-1和加法替换所有的负数吗?@NWest是的,但是。。。它适用于加法和减法,但是对于除法或升幂等更有趣的函数,它可能不起作用。仅供参考,您不需要创建额外的SQLCLR UDF和UDT,因为从SQLServer2008开始就添加了对UDA的多个输入参数的支持:这正是我想要的“更正式”的答案。谢谢