我有一个带有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个小时。这是我的不得已。
您需要编写您的where条件,如下所示:
在null
和0
作为@Age
的参数值的情况下都将起作用。
WHERE ( isnull(@Age, 0) = 0 OR ( isnull(@Age, 0) <> 0 and [c].[Age] >= @Age ))
AND ( isnull(@EmpStatus, '') = '' OR ( isnull(@EmpStatus, '') = 'Employed' and [c].[EmploymentStatus] in ('Employed Part Time (<35 hrs per week)', 'Employed Full Time (35+ hrs per week)')))