我在SQL Server中有一个名为dbo.GetBillsByDate
的用户定义的表值函数,它接受一个日期参数@dateOf
。
除2015年10月14日外,该功能在2015年10月的所有日期成功返回。例外日期导致除以零错误并返回警告。这是确切的文字:
Divide by zero error encountered.
Warning: Null value is eliminated by an aggregate or other SET operation.
该函数在14日以后的每个日期运行都让我感到困惑,但我发现当我使用变量传递数据时函数将成功返回。这会引起更多混乱。
所以:
select * from GetBillsByDate('10/14/2015');
返回错误,并且:
declare @dateOf date;
set @dateOf = '10/14/2015';
select * from GetBillsByDate(@dateOf);
没有。
有什么见解?
修改:dbo.GetBillsByDate
的全身
create function [dbo].[GetBillsByDate](@dateOf date)
returns table as
return
select propertyID PropertyCode,
billDate DateOf,
accountNum AccountNumber,
address1 Address1,
address2 Address2,
dateadd(day, 1-day(@dateOf), @dateOf) DatePosted,
glcode LedgerCode,
currMonthPostTotal AmountPosted
from AccruedBills
where convert(date, dateCreated) = @dateOf
and
startDate < endDate
and
billTotal >= 0
and
currMonthPostTotal<>0
union
select propertyID,
billDate,
accountNum,
address1,
address2,
dateadd(day, 1, dateadd(month, -1, dateadd(day, 1-day(@dateOf), @dateOf))),
glcode,
prevMonthPostTotal
from AccruedBills
where convert(date, dateCreated) = @dateOf
and
prevMonthPostTotal<>0
and
startDate < endDate
and
billTotal >= 0
union
select propertyID,
billDate,
accountNum,
address1,
address2,
dateadd(day, 1, dateadd(month, -1, dateadd(day, 1, dateadd(month, -1, dateadd(day, 1-day(@dateOf), @dateOf))))),
glcode,
remaMonthPostTotal
from AccruedBills
where convert(date, dateCreated) = @dateOf
and
remaMonthPostTotal<>0
and
startDate < endDate
and
billTotal >= 0
AccruedBills是一个视图。查询:
select * from AccruedBills where convert(date, dateCreated) = '20151014'
成功返回。
答案 0 :(得分:1)
AccruedBills
视图中发现的问题。该视图使用基于每个先前CTE构建的顺序CTE。其中两个查询包含除法运算。但是,在达到这些表达式之前,我会过滤掉将包含在除数列中的0。似乎@AdamMartin所说的是原因。每次评估时,视图都没有按照指定的顺序进行评估。通过显式检查除以0的除法,查询成功完成。