SQL Server 2008 R2标量函数不起作用

时间:2015-10-01 12:20:22

标签: sql-server function

我有这个功能,它应该会给我发票的月末日期。

E.g。发票(ARID)的创建日期为2015-09-1,eom为2015-09-30。

ALTER  FUNCTION [dbo].[sfEOM](@ARID int, @Switch int) 
RETURNS date 
AS
BEGIN    

declare @Letzter date
declare @MaxLeistungsdatum as date


if @Switch=1     
set @Letzter = (select CONVERT(date, DATEADD(MONTH,DATEDIFF   (MONTH,0,tblleistungen.LeistungsDatum),30),0) from dbo.tblleistungen where ARID=@ARID group by ARID,CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,tblleistungen.LeistungsDatum),30),0) )

else
set @MaxLeistungsdatum=(select max(LeistungsDatum) from tblDatensaetzeBA where ARID=@ARID group by ARID)
set @Letzter = (select CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,@MaxLeistungsdatum),30),0)) 

RETURN @Letzter
END
go

对两个不同的表使用一个函数我用作@Switch

select dbo.sfEOM(9307396,1)

select dbo.sfEOM(9307396,2)

中将NULL作为结果
select CONVERT(date, DATEADD(MONTH,DATEDIFF   (MONTH,0,tblleistungen.LeistungsDatum),30),0) from dbo.tblleistungen where ARID9307396 group by ARID,CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,tblleistungen.LeistungsDatum),30),0)

带来正确的日期。

如果省略@ Switch = 1并且只有

set @Letzter = (select CONVERT(date, DATEADD(MONTH,DATEDIFF   (MONTH,0,tblleistungen.LeistungsDatum),30),0) from dbo.tblleistungen where ARID=@ARID group by ARID,CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,tblleistungen.LeistungsDatum),30),0) )

它也有效。

那里有什么不对? 谢谢! 迈克尔

1 个答案:

答案 0 :(得分:2)

您需要为if语句定义代码块:

ALTER  FUNCTION [dbo].[sfEOM](@ARID int, @Switch int) 
RETURNS date 
AS
BEGIN    
    declare @Letzter date
    declare @MaxLeistungsdatum as date

    if @Switch = 1  
    begin   
        set @Letzter = (select CONVERT(date, DATEADD(MONTH,DATEDIFF   (MONTH,0,tblleistungen.LeistungsDatum),30),0) from dbo.tblleistungen where ARID=@ARID group by ARID,CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,tblleistungen.LeistungsDatum),30),0) )
    end
    else
    begin
        set @MaxLeistungsdatum=(select max(LeistungsDatum) from tblDatensaetzeBA where ARID=@ARID group by ARID)
        set @Letzter = (select CONVERT(date, DATEADD(MONTH,DATEDIFF(MONTH,0,@MaxLeistungsdatum),30),0)) 
    end
    return @Letzter
end;