Sql 如何解决超出最大存储过程、函数、触发器或视图嵌套级别(限制32)的问题

Sql 如何解决超出最大存储过程、函数、触发器或视图嵌套级别(限制32)的问题,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我面临着超过最大存储过程、函数触发器或视图嵌套级别的问题。在这里,我想查找基于fromdate和todate的数据 我的问题是,我试图将一种日期格式转换为另一种。例如,我正在将此格式08-06-2020 00:00:00转换为此格式2020-06-08 00:00:00.000。错误状态为=1,我正在获取数据,但有此错误。如果有人能帮助我,我将不胜感激 以下是我的存储过程: ALTER PROCEDURE [dbo].[USP_GetRequest_DataListForViewPrint]

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

我的问题是,我试图将一种日期格式转换为另一种。例如,我正在将此格式08-06-2020 00:00:00转换为此格式2020-06-08 00:00:00.000。错误状态为=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
ALTER PROCEDURE[dbo]。[USP\u GetRequest\u DataListForViewPrint]
@RequestNo VARCHAR(50),
@FromDate varchar(50),
@ToDate varchar(50岁),
@状态varchar(20)
作为
开始
声明@SQLStr varchar(8000)
声明@CurrentDate Varchar(100)=GETDATE()
如果(@RequestNo不为空)
开始
SET@SQLStr='从CYGNUX_Request_头中选择Id、RequestStatus、RequestNo、RequestDate,其中RequestNo='+''''+@RequestNo+'';
结束
其他的
如果@Status='1'
开始
SET@SQLStr='从CYGNUX_请求_头中选择Id、RequestStatus、RequestDate、RequestNo,其中RequestDate介于'+CHAR(39)+CONVERT(varchar(10)、CONVERT(datetime,@FromDate,101)、103)+CHAR(39)+'和'+CHAR(39)+CONVERT(varchar(10)、CONVERT(datetime,@ToDate,101)、103)+CHAR(39)之间;
结束
如果@Status='2'
开始
将@SQLStr='从CYGNUX_Request_头中选择Id、RequestStatus、RequestNo、RequestDate,其中RequestDate>='+CHAR(39)+CAST(DATEADD(day,-7,convert(varchar(100),@CurrentDate))作为varchar(50))+CHAR(39);
结束
如果@Status='3'
开始
设置@SQLStr='从CYGNUX_请求_头中选择Id、RequestStatus、RequestNo、RequestDate作为今天,其中RequestDate='+CHAR(39)+convert(varchar(50),@CurrentDate)+CHAR(39);
结束
如果@Status='4'
开始

SET@SQLStr='从CYGNUX_Request_头中选择Id、RequestStatus、RequestNo、RequestDate,其中RequestDate我认为这段代码不会导致您的问题。但是仍然可以通过消除动态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:

   

请不要发布错误消息的截图,发布实际文本!事实上,您有一个达到32次迭代的嵌套,这就推断出一个设计缺陷。你想解决的实际问题是什么?@SaritaPal。此代码似乎没有嵌套问题。一个严重的设计缺陷——包括在存储过程中使用动态SQL,确保在进行任何重命名时语法分析工具都找不到任何东西。30年来,我从未达到过这个极限,所以你做了一些非常离谱的事情。这显然是一个设计问题,超出了问答网站的范围。似乎CYGNUX_请求_头必须是一个包含大量嵌套视图的视图,这里没有任何其他视图可以达到嵌套限制。此外,@status=1表达式的结果以不同于其他表达式的顺序输出列。那可能不是你想做的,是吗?正如其他人所说,这里不需要动态SQL。