【问题标题】:Executing stored procedure when parameters are NULL参数为NULL时执行存储过程
【发布时间】: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


    【解决方案1】:

    你需要写下你的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)')))  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多