如何通过此查询创建表值函数?

问题描述

我正在尝试从查询创建表值函数,但是 它给我错误 无法从函数内部访问临时表。 消息2772,级别16,状态1,过程fn_GetDaysType,第33行

功能将计算两个日期(如果是周末,假日或工作日)之间的日期类型。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[fn_GetDaysType]
(
@DateFrom DATETIME,--@DateFrom - The starting date for your calculation
@CalendarFunction NVARCHAR(1),--@CalendarFunction - The holiday type function you want to use
@Dateto AS DATETIME,--@Dateto - The end of the date range you want to use
@AdjustMode BIT,--@AdjustMode - Calculate the days between the dates as 0 Exclusive or 1 Inclusive of the first day.
@AdjustWeekEnds BIT,--@AdjustWeekend - Excludes weekends from your calculations
@AdjustHolidays BIT,--@AdjustHolidays - Excludes holidays if the holiday function matches 
@DayDiff int 
)                               /*@AdjustMode 0=Count whole days only,1=Any day counts as 1*/

RETURNS TABLE
AS
RETURN (
    Select @DayDiff = DateDiff(day,@DateFrom,@Dateto) 

IF OBJECT_ID('tempdb..#Tally') IS NOT NULL 
   DROP TABLE #Tally

;WITH
cte_tally10 AS (
SELECT number FROM (VALUES(0),(0),(0)) AS numbers(number)
),cte_tally1000 AS (
SELECT 0 AS number UNION ALL SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS number
FROM cte_tally10 c1 CROSS JOIN cte_tally10 c2 CROSS JOIN cte_tally10 c3
)

-- tally starts at 0,so we need to remove 1 from DayDiff
select * into #Tally 
  from cte_tally1000
where number <= @DayDiff 

select
    count(1) - (1 - @AdjustMode) as TotalDays,sum(case when @AdjustHolidays = 1 
               AND hDate is not null then 1 else 0 end) as Holidays,sum(case when @AdjustWeekEnds = 1 
            AND DatePart(dw,DateAdd(day,n.number,@DateFrom)) % 7 = 5  
             then 1 else 0 end)  as Fridays,count(1) - (1 - @AdjustMode) - 
    sum(case when @AdjustHolidays = 1 
               AND hDate is not null then 1 else 0 end) -
    sum(case when @AdjustWeekEnds = 1 
            AND DatePart(dw,@DateFrom)) % 7 = 5 then 1 else 0 end) as TotalWorkDays-- /Friday/
  from  #Tally N
    left join [DWH_Biostar].[dbo].[HOLIDAYS_LR] h
        on h.hdate = DateAdd(day,number,@DateFrom)
       and  nHoliday = @CalendarFunction
)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)