SQLCLR聚合:没有关于消除NULL值的消息

时间:2015-09-29 12:03:32

标签: sql-server aggregate-functions sqlclr

当我做的时候

SELECT SUM(some_field) FROM some_table

结果是一个记录/字段,其中包含数字。此外,如果Warning: Null value is eliminated by an aggregate or other SET operation.在某个地方的某个地方有some_field值,则会向NULL行发送一条消息。只有当它们都是NULL(或表格为空)时,它才会返回NULL

我目前正在编写自己的SqlUserDefinedAggregate,尽管事情按预期工作,但当其中一个值传递为NULL时, NOT 会显示此消息。该功能的结果仍然正确,但没有警告。首先我假设我可能必须在Terminate()方法中手动管道,但是,唉,SQLCLR然后向我发出InvalidOperationException Data acces is not allowed in this context.

任何提示?

1 个答案:

答案 0 :(得分:1)

如果您的聚合丢弃NULL s,那么IsInvariantToNulls属性肯定应设置为true,否则有时会出现意外结果,如{{3}的MSDN页面所述}}:

  

如果聚合对空值不变,则查询处理器使用此属性 true 。也就是说,S的集合{NULL}与S的集合相同。例如,MIN和MAX等集合函数满足此属性,而COUNT(*)则不满足。

     

错误地设置此属性可能会导致查询结果不正确。此属性不是优化器提示;它会影响所选的计划和查询返回的结果。

UDA是一个功能,因此没有SqlContext.Pipe可供使用。即使有,Terminate方法也不适合处理这个问题,因为它针对每个组执行。但是,在使用SUM时您看到的警告是ANSI警告,并且针对查询显示一次,而不是按组显示。

因此,如果SQL Server没有显示警告,那么您可能无法做任何事情。我假设SQL Server没有使用IsInvariantToNulls属性来了解它是否应该显示消息,因为它不能保证准确设置。

就个人而言,我发现这是一个好处,因为在我看来," Null值被聚合消除了#34;警告完全没有帮助,但是如果你想摆脱它,你需要使用ISNULL()注入一个不会影响结果的值(例如0 SUM 1}}),或关闭所有ANSI警告,在这种情况下,您禁用一些有时有用的警告。