问题描述
我正在尝试从查询创建表值函数,但是 它给我错误 无法从函数内部访问临时表。 消息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 (将#修改为@)