Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将选项(MAXRECURSION 0)与cte insert一起使用到临时表中_Sql Server_Tsql_Stored Procedures_Common Table Expression_Recursive Query - Fatal编程技术网

Sql server 如何将选项(MAXRECURSION 0)与cte insert一起使用到临时表中

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行] 声明终止了。在

当我用这些来称呼这个的时候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,请在此处提及此语句。谢谢

  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之后。当我将错误放在末尾时,错误发生请用添加选项的方式更新您的问题,并将您得到的错误也包括在问题中。