【发布时间】:2016-12-02 12:11:12
【问题描述】:
我正在尝试使用以下存储过程将日期、dayName 等年度周末详细信息插入到 SQL Server 表中
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'
返回以下结果
这很好用,但是我无法将这些详细信息添加/插入到下表中
当我尝试通过别名 CTE
访问 WEEKEND 详细信息时遇到以下错误语句终止。最大递归100已用完 在语句完成之前
虽然我已经添加了子句
OPTION (MaxRecursion 370)
我在堆栈溢出时发现的这些链接建议
- The maximum recursion 100 has been exhausted before statement completion
- The statement terminated. The maximum recursion 100 has been exhausted before statement completion
编辑
当我尝试这样的事情时,基本上我会遇到指定的错误
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
我们将不胜感激任何形式的帮助!我只需要在我指定的表中插入数据!
谢谢!
【问题讨论】:
-
if (select COUNT(*) from tblWeekSettings) < 1->if not exists(select 1 from tbl...) -
显示带有 sp 名称、行号等的完整错误消息。
-
@ivanStarostin 这个存储过程工作得很好,我只需要将数据插入到我在问题中提到的表中!
-
这是一个练习吗?如果不是,为什么要使用递归而不是利用一周有 7 天的事实?您可以从一年中的第一个周末开始循环 52-53 次,每个循环增加 7 天。
-
@AimalKhan “当我尝试通过别名 CTE 访问 WEEKEND 详细信息时遇到以下错误” - 显示包含 sp 名称、行号等的完整错误消息.你得到一个例外,不是吗?无需任何编辑即可显示该异常。
标签: sql sql-server stored-procedures recursion