当传入值为null时使用可选参数?

时间:2017-04-04 18:51:27

标签: sql-server sql-server-2008 tsql stored-procedures reporting-services

我有一个如下所示的存储过程。

假设我调用过程usp_Exclusion 'Joe', null, 'Bob',我需要在存储过程中做些什么,以便将null值更改为字符串(在本例中为'')?除非这是唯一的方法,否则我不希望遍历每个参数并设置为字符串,如果它为空。

ALTER procedure dbo.usp_Exclusion
(    
    @exclude1 varchar(100) = '',
    @exclude2 varchar(100) = '',
    @exclude3 varchar(100) = ''
)

as

declare @table table 
(
    EmpName varchar(20),
    EmpLast varchar(20)
)

insert into @table (empName, emplast) 
values 
('Joe', 'Smith'),
('Jim', 'Neumann'),
('Bob', 'Bright'),
('James', 'Dung')

SELECT * from @table where EmpName not in (isnull(@exclude1, ''), isnull(@exclude2, ''), isnull(@exclude3, ''))
--SELECT * from @table where EmpName not in (@exclude1, @exclude2, @exclude3)

我问的原因是因为从SSRS报告调用此SP,默认情况下参数为空,因此报告加载时没有任何用户交互。我能使其工作的唯一方法是将报表中的每个参数设置为''(空白区域)。

唯一的问题是,当有人要在参数中输入内容时,这很麻烦;他们不知道那里已经有空间了。

我这样做的原因是因为IN子句不能有null值。

感谢。

我总是可以在ISNULL子句中使用IN

2 个答案:

答案 0 :(得分:1)

使用案例陈述

设置新参数
  

@ exclude_new_1 = CASE WHEN(@ exclude1 IS NULL)THEN''ELSE @ exclude1 END

在您的选择中使用新参数。应该做的工作......

答案 1 :(得分:0)

您可以尝试以下内容

SELECT * from @table T LEFT JOIN 
(VALUES (@exclude1),(@exclude2), (@exclude3)) as E(excludeName) ON
T.EmpName =isnull(E.excludeName, '')
WHERE E.excludeName is NULL

示例输出 enter image description here

<强>说明: 我们使用Values构造函数语法创建动态表,并使用LEFT JOIN到@table以获取所有带有ISNULL子句的值,然后最后使用WHERE来有效地使用NOT IN条件。