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