当我做的时候
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.
任何提示?
答案 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警告,在这种情况下,您禁用一些有时有用的警告。