【发布时间】:2020-03-20 05:34:44
【问题描述】:
我有一个带有 6 个参数的存储过程,即使某些参数为空,我也想执行它。这就是我所拥有的:
CREATE OR ALTER PROCEDURE [dbo].[report]
(@StartDate DATETIME,
@EndDate DATETIME,
@Mode VARCHAR(50) = '', -- { SS105 | SS106 }
@DEBUG BIT = 0,
@Age FLOAT = NULL, -- { Greater than 59 or less )
@EmpStatus VARCHAR(255) = NULL) -- { 'Employed' OR 'Unemployed }
AS
BEGIN
IF @Mode = 'SS106'
BEGIN
DECLARE @SS106 TABLE
(
[ClientID] INT
, [ClientName] VARCHAR(255)
, [VService] VARCHAR(10)
, [Age] FLOAT
, [EmploymentStatus] VARCHAR(255)
);
INSERT INTO @SS106
(
[ClientID]
, [ClientName]
, [VService]
, [Age]
, [EmploymentStatus]
)
SELECT DISTINCT
[ClientID] = [c].[ClientID]
, [ClientName] = [c].[ClientName]
, [VService] = [c].[VService]
, [Age] = [c].[Age]
, [EmploymentStatus] = [c].[EmploymentStatus]
FROM [#Table] AS [c] WITH (NOLOCK)
WHERE
( @Age IS NULL OR [c].[Age] >= @Age )
AND
( @EmpStatus IS NULL OR ( @EmpStatus = 'Employed' AND [c].[EmploymentStatus] IN
('Employed Part Time (<35 hrs per week)', 'Employed Full Time (35+ hrs per week)')
)
OR
@EmpStatus IS NULL OR ( @EmpStatus = 'Unemployed' AND [c].[EmploymentStatus] NOT IN
('Employed Part Time (<35 hrs per week)', 'Employed Full Time (35+ hrs per week)')
)
)
AND [c].[VService] IN ('SS106')
IF @DEBUG = 1
BEGIN
SELECT * FROM @SS106
END
RETURN 0
END
所以我知道什么时候执行存储过程,你会简单地调出执行调用。
[dbo].[report] '1/1/2019' , '1/4/2019' , 'SS106' , '1' , '58' , 'Employed'
我希望在最后两个参数为空时执行存储过程并显示表格。当我将 @Age 和 @EmpStatus 设置为所需的值时,它可以工作。但是,当我将 @EmpStatus 保留为 NULL 并将其余部分保留为值时,它会失败。这可能是一个括号问题,但这样做是否有效。
我知道这是很多阅读,但我已经在这里停留了 2 个小时。这是我最后的手段。
【问题讨论】:
标签: sql-server stored-procedures parameters