Sql server 如何将选项(MAXRECURSION 0)与cte insert一起使用到临时表中
当我用这些来称呼这个的时候parameters@MediaSellerID=138,@StartDate=N'9/1/2020',@EndDate=N'10/7/2020'它成功返回数据 但是当我经过这些parameters@MediaSellerID=213,@StartDate='8/4/2020',@EndDate=N'11/25/2020' 发生此错误 Msg 530,16级,状态1,程序GetAvailableDatesforCampaign,第81行[批次开始第2行] 声明终止了。在语句完成之前,已耗尽最大递归100 如果任何人有此解决方案选项MaxRecursion 0,请在此处提及此语句。谢谢Sql server 如何将选项(MAXRECURSION 0)与cte insert一起使用到临时表中,sql-server,tsql,stored-procedures,common-table-expression,recursive-query,Sql Server,Tsql,Stored Procedures,Common Table Expression,Recursive Query,当我用这些来称呼这个的时候parameters@MediaSellerID=138,@StartDate=N'9/1/2020',@EndDate=N'10/7/2020'它成功返回数据 但是当我经过这些parameters@MediaSellerID=213,@StartDate='8/4/2020',@EndDate=N'11/25/2020' 发生此错误 Msg 530,16级,状态1,程序GetAvailableDatesforCampaign,第81行[批次开始第2行] 声明终止了。在
ALTER Procedure [dbo].[GetAvailableDatesforCampaign]
-- exec GetAvailableDatesforCampaign 2,getdate(),getdate()
@MediaSellerID int,
@StartDate datetime,
@EndDate datetime
AS
BEGIN
SET FMTONLY OFF
Declare @Frequency as varchar(200)
Declare @Weeks as varchar(200)
Declare @Days as varchar(200)
Declare @CopyDeadlineDays as int
Declare @DayItem as varchar(20)
Declare @WeekItem as varchar(200)
Declare @DayNumber as int
Delete from tblCampaignDates
select
@Frequency=MediaFrequency,
@Weeks=BroadcastDays,
@Days=BroadcastDaysWeeks,
@CopyDeadlineDays=Copydeadline
from
tblMediaSeller where MediaSeller_ID=@MediaSellerID
CREATE TABLE
#TempAvailableDates
(
AvailableDate datetime default GetDate()
)
CREATE TABLE
#TempAllDates
(
AllDate datetime,
DayNames varchar(20),
Weeknumber int
)
IF(@Frequency='Bi-Weekly' or @Frequency='Weekly' or @Frequency='Monthly')
BEGIN
DECLARE MY_CURSOR2 CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT DISTINCT
Item
FROM
dbo.SplitString(@Days)
OPTION (MAXRECURSION 0)
OPEN MY_CURSOR2
FETCH NEXT FROM MY_CURSOR2 INTO @DayItem
WHILE @@FETCH_STATUS = 0
BEGIN
-- Select All dates of those days in tblMediaSeller (Adv Publishing day) from start date to End dates
Set @DayNumber= CASE WHEN @DayItem='Monday' THEN 1
WHEN @DayItem='Tuesday' THEN 2
WHEN @DayItem='Wednesday' THEN 3
WHEN @DayItem='Thursday' THEN 4
WHEN @DayItem='Friday' THEN 5
WHEN @DayItem='Saturday' THEN 6
WHEN @DayItem='Sunday' THEN 7
ELSE 0 END
IF(@DayNumber<>0)
BEGIN
SET DATEFIRST @DayNumber; -- First day of the week is set to monday
WITH CTE(dt)
AS
(
SELECT @StartDate
UNION ALL
SELECT DATEADD(d, 1, dt)
FROM CTE
WHERE dt <@EndDate
)
INSERT INTO
#TempAllDates
SELECT
CONVERT(date,dt),
datename(dw, dt),
DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, dt), 0), dt)
FROM
CTE
WHERE
datepart ("dw", dt) = 1;
END
FETCH NEXT FROM MY_CURSOR2 INTO @DayItem
END
CLOSE MY_CURSOR2
DEALLOCATE MY_CURSOR2
Set @WeekItem= REPLACE(@Weeks, 'Week', '');
DECLARE @ActualStartDate as Datetime
Set @ActualStartDate = (Select top 1 AllDate from #TempAllDates)
IF(@CopyDeadlineDays is null)
BEGIN
IF(@ActualStartDate>= DATEADD(day,5,getdate()))
BEGIN
Insert into
#TempAvailableDates
Select
AllDate
From
#TempAllDates
WHERE
Weeknumber in (select cast(item as int) from dbo.SplitString(@WeekItem))
END
ELSE
BEGIN
Insert into
#TempAvailableDates
Select
AllDate
From
#TempAllDates
WHERE
Weeknumber in (select cast(item as int) from dbo.SplitString(@WeekItem))
AND AllDate>=DATEADD(day,5,getdate())
END
END
ELSE
BEGIN
IF(@ActualStartDate>= DATEADD(day,@CopyDeadlineDays,getdate()))
BEGIN
Insert into
#TempAvailableDates
Select
AllDate
From
#TempAllDates
WHERE
Weeknumber in (select cast(item as int) from dbo.SplitString(@WeekItem))
END
ELSE
BEGIN
Insert into
#TempAvailableDates
Select
AllDate
From
#TempAllDates
WHERE
Weeknumber in (select cast(item as int) from dbo.SplitString(@WeekItem))
AND AllDate>=DATEADD(day,@CopyDeadlineDays,getdate())
END
END
END
ELSE
BEGIN
IF(@CopyDeadlineDays is null)
begin
IF(@StartDate>= DATEADD(day,5,getdate()))
BEGIN
Insert into
#TempAvailableDates
SELECT TOP
(DATEDIFF(DAY, @StartDate, @EndDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @StartDate)
FROM
sys.all_objects a
CROSS JOIN
sys.all_objects b;
END
ELSE
BEGIN
SET @StartDate=@StartDate+5
Insert into
#TempAvailableDates
SELECT TOP
(DATEDIFF(DAY, @StartDate, @EndDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @StartDate)
FROM
sys.all_objects a
CROSS JOIN
sys.all_objects b;
END
END
ELSE
BEGIN
IF(@StartDate>= DATEADD(day,@CopyDeadlineDays,getdate()))
BEGIN
Insert into
#TempAvailableDates
SELECT TOP
(DATEDIFF(DAY, @StartDate, @EndDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @StartDate)
FROM
sys.all_objects a
CROSS JOIN
sys.all_objects b;
END
ELSE
BEGIN
SET @StartDate=@StartDate+@CopyDeadlineDays
Insert into
#TempAvailableDates
SELECT TOP
(DATEDIFF(DAY, @StartDate, @EndDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @StartDate)
FROM
sys.all_objects a
CROSS JOIN
sys.all_objects b;
END
END
END
Insert into
tblCampaignDates
Select
AvailableDate
from #TempAvailableDates
Select AvailableDate from tblCampaignDates
END
这应该起作用:
WITH CTE(dt) AS (
SELECT @StartDate
UNION ALL
SELECT DATEADD(d, 1, dt)
FROM CTE
WHERE dt <@EndDate
)
INSERT INTO #TempAllDates
SELECT CONVERT(date,dt), datename(dw, dt), DATEDIFF(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, dt), 0), dt)
FROM CTE
WHERE datepart(dw, dt) = 1
OPTION (MAXRECURSION 0);
是一个简单得多的例子。将选项放在查询的末尾,在WHERE之后。当我将错误放在末尾时,错误发生请用添加选项的方式更新您的问题,并将您得到的错误也包括在问题中。