Выполнение хранимой процедуры, когда параметры равны NULL - PullRequest
1 голос
/ 20 марта 2020

У меня есть хранимая процедура с 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' 

Я бы хотел хранимую процедуру выполнить, когда последние 2 параметра пусты, и отобразить таблицу. Это работает, когда я устанавливаю @Age и @EmpStatus на желаемое значение. Однако это не удается, когда я оставляю @EmpStatus как NULL, а остальные со значением. Вероятно, это проблема с круглыми скобками, но есть ли эффективный способ сделать это.

Я знаю, что это много, но я застрял здесь на 2 часа. Это мое последнее средство.

1 Ответ

0 голосов
/ 20 марта 2020

Вам необходимо записать ваше условие 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)')))  
...