选择中的SQL用户定义函数 - 再次

时间:2017-08-03 10:36:18

标签: sql sql-server sql-server-2008

首先道歉 - 我知道这个主题有很多线索,但我无法找到问题的答案。

我有一个UDF来计算两个日期之间的工作日。我正在使用SQL Server 2008。

CREATE FUNCTION dbo.fn_CountWeekDays
(
    @fromdate Datetime,
    @todate Datetime
)
RETURNS TABLE AS RETURN
(

SELECT
   (DATEDIFF(dd, @fromdate, @todate) + 1)
  -(DATEDIFF(wk, @fromdate, @todate) * 2)
  -(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END)
  As NoOfWeekDays

)

我试图在select语句中与另一个表一起调用它:

select dbo.fn_CountWeekDays(a.date1,a.date2) as workdays
from alex_datetest a

但是我收到了错误:

找不到任何一列" dbo"或用户定义的函数或聚合" dbo.fn_CountWeekDays",或名称不明确。

如果我放弃dbo。然后我明白了:

' fn_CountWeekDays'不是公认的功能名称。

有没有人有任何想法我为什么不能参考这个功能?

提前致谢

亚历

3 个答案:

答案 0 :(得分:1)

正如我在评论中所做的那样,将您的功能改为:

CREATE FUNCTION dbo.fn_CountWeekDays
(
    @fromdate Datetime,
    @todate Datetime
)
RETURNS int
AS
BEGIN DECLARE @int int

SET @int = 
   (DATEDIFF(dd, @fromdate, @todate) + 1)
  -(DATEDIFF(wk, @fromdate, @todate) * 2)
  -(CASE WHEN DATENAME(dw, @fromdate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @todate) = 'Saturday' THEN 1 ELSE 0 END);

  RETURN @int
END

答案 1 :(得分:0)

您有一个表值函数,因此您想使用apply

select cwd.*
from alex_datetest a cross apply 
     dbo.fn_CountWeekDays(a.date1,a.date2) cwd

如果要为列命名:

select cwd.workdays
from alex_datetest a cross apply 
     dbo.fn_CountWeekDays(a.date1,a.date2) cwd(workdays)

答案 2 :(得分:0)

由于它是返回表格,您可能需要使用交叉申请,如下所示:

Select * from yourtable a
   cross apply dbo.fn_CountWeekDays(a.date1,a.date2) f