Sql server 当传入值为空时使用可选参数?

Sql server 当传入值为空时使用可选参数?,sql-server,sql-server-2008,tsql,stored-procedures,reporting-services,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(

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

假设我调用过程
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)
我询问的原因是,此SP是从
SSRS
报告调用的,默认情况下,参数为空,因此报告将在不进行任何用户交互的情况下加载。我能让它工作的唯一方法是将报告中的每个参数设置为
'
(一个空白)

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

我这样做的原因是因为子句中的
不能有
null

谢谢


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

EDIT:pmbAustin提供了更好的解决方案

@exclude_new_1 = COALESCE(@exclude1, '');
旧答案:

使用case语句设置新参数

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

在选择中使用新参数。你应该做这项工作……

你可以试试下面的方法

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

说明:
我们使用Values构造函数语法创建一个动态表,并左键连接到@table以使用ISNULL子句获取所有值,最后使用WHERE来有效地使用NOT IN条件。

最好使用COALESCE()而不是ISNULL()。。。首先,它可以有更多的参数(它返回第一个非null参数),其次,它是ANSI标准,而ISNULL不是。因此,您可以在SP主体中的每个参数引用周围使用COALESCE,也可以创建一个新的局部变量,并为其指定参数的COALESCE值(@localExclude2=COALESCE(@exclude2,')),并在SP主体中的任何位置使用本地副本。只使用COALESCE要简单得多:@exclude\u new\u 1=COALESCE(@exclude1,);“触摸这个^^^