微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试从查询创建表值函数,但是 它给我错误 无法从函数内部访问临时表。 消息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 举报,一经查实,本站将立刻删除。