繁体   English   中英

如何解决最大存储过程,function,触发器,或视图嵌套级别超出(限制32)

[英]How to solve maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)

我面临最大存储过程,function 触发器,或者视图嵌套级别超出。 在这里,我想查找基于 fromdate 和 todate 的数据。

我的问题是我试图将一种日期格式转换为另一种。 例如,我正在将此格式 08-06-2020 00:00:00 转换为 2020-06-08 00:00:00.000。 错误在 Status = 1 中,我正在获取我的数据,但出现此错误。 如果有人可以帮助我,我将不胜感激。

这是我的存储过程:

ALTER PROCEDURE [dbo].[USP_GetRequest_DataListForViewPrint]
    @RequestNo VARCHAR(50),
    @FromDate varchar(50),
    @ToDate varchar(50),
    @Status varchar(20)
AS
BEGIN
    DECLARE @SQLStr varchar(8000)
    DECLARE @CurrentDate  Varchar(100) = GETDATE()

    IF (@RequestNo IS NOT NULL)
    BEGIN
        SET @SQLStr = 'SELECT Id,RequestStatus, RequestNo,RequestDate From CYGNUX_Request_Header WHERE RequestNo='+''''+@RequestNo+'''';
    END
    ELSE      
        IF @Status = '1'
        BEGIN
            SET @SQLStr = 'select Id,RequestStatus,RequestDate,RequestNo from CYGNUX_Request_Header where RequestDate between '+CHAR(39)+  CONVERT(varchar(10), CONVERT(datetime, @FromDate, 101), 103)  +CHAR(39)+ ' AND '+CHAR(39)+ CONVERT(varchar(10), CONVERT(datetime, @ToDate, 101), 103) +CHAR(39);
        END

        IF @Status ='2'
        BEGIN
            SET @SQLStr = 'select Id,RequestStatus, RequestNo, RequestDate from CYGNUX_Request_Header where RequestDate>='+CHAR(39)+ CAST(DATEADD(day,-7,convert(varchar(100),@CurrentDate)) AS varchar(50))+CHAR(39);
        END

        IF @Status ='3'
        BEGIN
            SET @SQLStr = 'select Id,RequestStatus,RequestNo, RequestDate As Today from CYGNUX_Request_Header Where RequestDate='+CHAR(39)+  convert(varchar(50) , @CurrentDate)  +CHAR(39) ;
        END

        IF @Status ='4'
        BEGIN
            SET @SQLStr = 'select Id,RequestStatus, RequestNo,RequestDate  from CYGNUX_Request_Header WHERE RequestDate<=' +CHAR(39)+  convert(varchar(50) , @CurrentDate)  +CHAR(39);
        END 
    
        PRINT @SQLStr;
        EXEC(@SQLStr);
    END

这是我面临的错误截图:

在此处输入图像描述

我认为这段代码不会导致您的问题。 但仍可以通过消除动态 SQL 来改进。 如果不需要,请勿使用动态 SQL:

ALTER PROCEDURE [dbo].[USP_GetRequest_DataListForViewPrint]
  @RequestNo VARCHAR(50),
  @FromDate DATE,
  @ToDate DATE,
  @Status varchar(20)
AS
BEGIN

    IF (@RequestNo IS NOT NULL)
    BEGIN
        SELECT Id, RequestStatus, RequestNo, RequestDate
        From CYGNUX_Request_Header
        WHERE RequestNo = @RequestNo;
    END;
    ELSE IF (@status = '1')
    BEGIN
        select Id, RequestStatus, RequestNo, RequestDate
        from CYGNUX_Request_Header 
        where RequestDate between @FromDate and ToDate;
    END;
    ELSE IF (@status = '2')
    BEGIN
        select Id, RequestStatus, RequestNo, RequestDate
        from CYGNUX_Request_Header 
        where RequestDate >= convert(date, getdate());
    END;
    . . .
END:

   

您的问题是“EXEC sp_name”命令位于存储过程本身内部,因此它一直在循环中运行。

你可以做:

创建 sp_name... 开始... 结束

GO

执行(sp_name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM