sql - 如何解决超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)
问题描述
我正面临超出最大存储过程、函数触发器或视图嵌套级别的问题。在这里,我想查找基于 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:
推荐阅读
- point-cloud-library - 是否有任何功能可以提取从cropbox生成的索引
- angularjs - 如何在 angularjs(1.x) 应用程序中使用 JSzip 外部库
- android - 如何将录制的声音保存在 Room 数据库中?
- javascript - Dropzone 不上传文件,有定位问题
- docker - 为什么我的超级账本结构网络中的链码占用 1.45GB 空间?
- angular - 错误 TS2322:类型 'void' 不可分配给类型 'Promise
| jQueryPromise ' - reactjs - Material-UI 复选框在网格中“跳跃”
- c# - HttpClient 错误太多请求速率限制
- javascript - 使用 JavaScript 删除屏幕尺寸低于某个像素的 div
- f# - F# 模块中定义中的意外关键字“成员”