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