当参数为NULL时执行存储过程

问题描述 投票:1回答:1

我有一个带有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
1个回答
0
投票

您需要编写您的where条件,如下所示:

null0作为@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)')))  
© www.soinside.com 2019 - 2024. All rights reserved.