Sql 哦,我的桌子,我在问题中提到过!这是练习吗?如果不是,为什么要使用递归,而不是利用一周有7天这一事实?您可以从一年的第一个周末开始循环52-53次,每次循环增加7天。@AimalKhan“当我试图通过别名CTE访问周末详细信息时,会遇到以下错误”-显示带有

Sql 哦,我的桌子,我在问题中提到过!这是练习吗?如果不是,为什么要使用递归,而不是利用一周有7天这一事实?您可以从一年的第一个周末开始循环52-53次,每次循环增加7天。@AimalKhan“当我试图通过别名CTE访问周末详细信息时,会遇到以下错误”-显示带有,sql,sql-server,stored-procedures,recursion,Sql,Sql Server,Stored Procedures,Recursion,哦,我的桌子,我在问题中提到过!这是练习吗?如果不是,为什么要使用递归,而不是利用一周有7天这一事实?您可以从一年的第一个周末开始循环52-53次,每次循环增加7天。@AimalKhan“当我试图通过别名CTE访问周末详细信息时,会遇到以下错误”-显示带有sp名称、行号等的完整错误消息。你有个例外,不是吗?在不进行任何编辑的情况下显示该异常。您希望如何在tblWeekSettings中获取值?只是好奇!这就是INSERT…SELECT语句所做的。@AimalKhan如果答案正确,您应该接受这个答


哦,我的桌子,我在问题中提到过!这是练习吗?如果不是,为什么要使用递归,而不是利用一周有7天这一事实?您可以从一年的第一个周末开始循环52-53次,每次循环增加7天。@AimalKhan“当我试图通过别名CTE访问周末详细信息时,会遇到以下错误”-显示带有sp名称、行号等的完整错误消息。你有个例外,不是吗?在不进行任何编辑的情况下显示该异常。您希望如何在tblWeekSettings中获取值?只是好奇!这就是
INSERT…SELECT
语句所做的。@AimalKhan如果答案正确,您应该接受这个答案。谢谢@ivanStarostin。你的建议奏效了:谢谢你的评论@m.jamshaidAlam,但我得到了答案!
alter procedure usp_AddOfficeHolidays
    @paramName NVARCHAR(max)
as
begin
    DECLARE @Year AS INT,
            @FirstDateOfYear DATETIME,
            @LastDateOfYear DATETIME

    -- You can change @year to any year you desire
    SELECT @year = 2016

    SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0)
    SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0)

    -- Creating Query to Prepare Year Data
    --declare dayN varchar(max)
    if (select COUNT(*) from tblWeekSettings) < 1
    begin
        ;WITH cte AS 
        (
            SELECT 
                1 AS DayID,
                @FirstDateOfYear AS FromDate,
                DATENAME(dw, @FirstDateOfYear) AS Dayname
            UNION ALL
            SELECT 
                cte.DayID + 1 AS DayID,
                DATEADD(d, 1 ,cte.FromDate),
                DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
            FROM cte
            WHERE DATEADD(d, 1, cte.FromDate) < @LastDateOfYear
        )
        SELECT FromDate AS Date, Dayname
        FROM CTE
        WHERE DayName IN (SELECT Param FROM dbo.fn_MVParam(@paramName,','))
        OPTION (MaxRecursion 370)
    end
    else
    begin
        Select 'Exists'
    end
end
exec usp_AddOfficeHolidays 'Saturday,Sunday'
 OPTION (MaxRecursion 370)
alter procedure usp_AddOfficeHolidays
@paramName NVARCHAR(max)
as
begin
----------------------------------------------------------
DECLARE @Year AS INT,
@FirstDateOfYear DATETIME,
@LastDateOfYear DATETIME
-- You can change @year to any year you desire
SELECT @year = 2016
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0)
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0)
-- Creating Query to Prepare Year Data
--declare dayN varchar(max)
if (select COUNT(*) from tblWeekSettings) < 1

    begin
        ;WITH cte AS (
        SELECT 1 AS DayID,
        @FirstDateOfYear AS FromDate,
        DATENAME(dw, @FirstDateOfYear) AS Dayname
        UNION ALL
        SELECT cte.DayID + 1 AS DayID,
        DATEADD(d, 1 ,cte.FromDate),
        DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
        FROM cte
        WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear
        )



        SELECT FromDate AS Date, Dayname
        FROM CTE
        WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,','))

        insert into tblWeekSettings(DayNo,WeekDayName,Dates)
        values('',Dayname,Date)

        OPTION (MaxRecursion 370)
    end

else
    begin
        Select 'Exists'
    end


--select cte
-----------------------------------------------------------
end
    SELECT FromDate AS Date, Dayname
    FROM CTE
    WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,','))
    insert into tblWeekSettings(DayNo,WeekDayName,Dates)
    values('',Dayname,Date)
    OPTION (MaxRecursion 370)
    ;with CTE (...)
    insert into tblWeekSettings(DayNo,WeekDayName,Dates)
    SELECT FromDate AS Date, Dayname
    FROM CTE
    WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,','))
    OPTION (MaxRecursion 370)
    insert into tblWeekSettings(DayNo,WeekDayName,Dates)
    values('',Dayname,Date)
alter procedure usp_AddOfficeHolidays
@paramName NVARCHAR(max)
as
begin
----------------------------------------------------------
DECLARE @Year AS INT,
@FirstDateOfYear DATETIME,
@LastDateOfYear DATETIME
-- You can change @year to any year you desire
SELECT @year = 2016
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0)
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0)
-- Creating Query to Prepare Year Data
--declare dayN varchar(max)
if (select COUNT(*) from tblWeekSettings) < 1

    begin
        ;WITH cte AS (
        SELECT 1 AS DayID,
        @FirstDateOfYear AS FromDate,
        DATENAME(dw, @FirstDateOfYear) AS Dayname
        UNION ALL
        SELECT cte.DayID + 1 AS DayID,
        DATEADD(d, 1 ,cte.FromDate),
        DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
        FROM cte
        WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear
        )


        insert into tblWeekSettings(DayNo,Dates,WeekDayName) 
        SELECT '',FromDate AS Date, Dayname
        FROM CTE WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 

        OPTION (MaxRecursion 30000) 




    end

else
    begin
        Select 'Exists'
    end


--select cte
-----------------------------------------------------------
end
alter procedure usp_AddOfficeHolidays
@paramName NVARCHAR(max)
as
begin
----------------------------------------------------------
DECLARE @Year AS INT,@DayNo as int=1,
@FirstDateOfYear DATETIME,
@LastDateOfYear DATETIME
-- You can change @year to any year you desire
SELECT @year = 2016
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0)
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0)
Select getdate() DateOfYear into #tbl where 1=0
-- Creating Query to Prepare Year Data
--declare dayN varchar(max)
if (select COUNT(*) from tblWeekSettings) < 1

    begin
            while (@FirstDateOfYear< @LastDateOfYear)
            begin
                Insert Into #tbl (DayNo,DateOfYear) values (@DayNo,@FirstDateOfYear)
                set @FirstDateOfYear+=1
                set @DayNo+=1;
            End

            Insert Into tblWeekSettings (DayNo,WeekDayName,Dates)
            SELECT DayNo,DATENAME(dw, DateOfYear) Name,DateOfYear AS Date
            FROM #tbl
            WHERE DATENAME(dw, DateOfYear) IN(SELECT Param FROM dbo.fn_MVParam(@paramName,','))

    end

else
    begin
        Select 'Exists'
    end


--select cte
-----------------------------------------------------------
end