SQL查询适用于变量,但不适用于文字

时间:2015-11-02 14:39:19

标签: sql sql-server tsql

我在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'

成功返回。

1 个答案:

答案 0 :(得分:1)

AccruedBills视图中发现的问题。该视图使用基于每个先前CTE构建的顺序CTE。其中两个查询包含除法运算。但是,在达到这些表达式之前,我会过滤掉将包含在除数列中的0。似乎@AdamMartin所说的是原因。每次评估时,视图都没有按照指定的顺序进行评估。通过显式检查除以0的除法,查询成功完成。