2014-02-12 36 views
0

我在执行存储过程时使用WHERE子句中的函数dbo.Split。当输入参数为NULL时,我不想执行此功能。如何处理存储过程中的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 

我用下面的SQL忽略过滤器上SR.fk_BranchType_ID@pk_BranchType_IDNULL

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

我想要做的@pk_BranchType_ID类似的东西。如果我像@pk_BranchType_ID那样使用ISNULL,则不会返回行。当它是NULL

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

回答

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 
+0

遗憾地说,但这个问题的状态,我想回行,即使参数是否为NULL,请告诉我,如果我能在使用dbo.Split –

+0

检查参数为空或不@ user12804 92我刚刚根据您更新的问题更新了我的答案。这应该适合你。 –

+0

正是我期望的...非常感谢! –

0

你可能需要将参数设置为null这样的:

@fk_BranchRegion_ID bigint is Null, 
@pk_BranchType_ID nvarchar(100) is Null 
相关问题