如何处理存储过程中的NULL参数

时间:2014-02-12 05:55:20

标签: sql-server sql-server-2008

我在执行存储过程时在dbo.Split子句中使用函数WHERE。当输入参数为NULL时,我不想执行此函数。

E.g。

Create Procedure [dbo].[HRMS_RPT_CategoryWiseSeniorityList]
   @fk_BranchRegion_ID bigint = null,  
   @pk_BranchType_ID nvarchar(100) = null  
AS        
BEGIN      
    Select distinct SR.fk_branchType_ID
    from HRMS_Employee_ServiceRecord SR (nolock)  
    Inner Join HRMS_Mst_Branch B  (nolock) On B.pk_Branch_ID = SR.fk_Branch_ID     
    Where         
        B.fk_BranchRegion_ID = IsNull(@fk_BranchRegion_ID,B.fk_BranchRegion_ID) --Region  Condition
        AND SR.fk_BranchType_ID in (SELECT * from dbo.Split( @pk_BranchType_ID,','))       
END

SR.fk_BranchType_ID@pk_BranchType_ID时,我使用以下SQL忽略NULL上的过滤器:

SR.fk_BranchType_ID = IsNull(@pk_BranchType_ID, SR.fk_BranchType_ID)

我想为@pk_BranchType_ID做类似的事情。如果我像使用ISNULL一样使用@pk_BranchType_ID,则不会返回任何行。当它是NULL

SR.fk_BranchType_ID@pk_BranchType_ID时,如何让我的存储过程忽略NULL上的过滤器?

2 个答案:

答案 0 :(得分:0)

您可能希望将参数设置为null,如下所示:

@fk_BranchRegion_ID bigint is Null,
@pk_BranchType_ID nvarchar(100) is Null

答案 1 :(得分:0)

如果要在输入参数为NULL时删除过滤器,可以在WHERE子句中使用NULL检查,并与OR结合使用,如下所示:

Create Procedure [dbo].[HRMS_RPT_CategoryWiseSeniorityList]
@fk_BranchRegion_ID bigint = null,  
@pk_BranchType_ID nvarchar(100) = null  

AS        
BEGIN      
Select
    distinct SR.fk_branchType_ID
    FROM HRMS_Employee_ServiceRecord SR WITH(nolock)  
    INNER JOIN HRMS_Mst_Branch B  WITH(nolock) 
    ON B.pk_Branch_ID = SR.fk_Branch_ID
    WHERE B.fk_BranchRegion_ID = IsNull(@fk_BranchRegion_ID,B.fk_BranchRegion_ID) --Region Condition
    -- Remove filter on @pk_BranchType_ID when it is NULL
    AND (  @pk_BranchType_ID IS NULL
        OR SR.fk_BranchType_ID in (SELECT * from dbo.Split( @pk_BranchType_ID,',')) )
END