我有一个如下所示的存储过程。传入值为空时使用可选参数?
假设我调用过程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
报告叫,并且默认的参数是空的,所以报告负载无需任何用户交互。如果我将报告中的每个参数设置为''
(空白空间),我可以使其工作的唯一方法是。
唯一的问题是,当有人打算在参数中输入某些内容时,它很麻烦;他们不知道那里已经有空间了。
而我这样做的原因是因为IN
子句不能有null
值。
谢谢。
我总是可以在IN
子句中使用ISNULL
。
更好地使用COALESCE()而不是ISNULL()...首先,它可以有更多的参数(它返回第一个非空参数),第二,它是ANSI标准,而ISNULL不是。因此,您可以在每个SP的主体参数引用周围使用COALESCE,也可以创建一个新的局部变量并为其分配参数COALESCE(@ localExclude2 = COALESCE(@ exclude2,''))和使用本体SP中的本地副本。 – pmbAustin