1

我有一个如下所示的存储过程。传入值为空时使用可选参数?

假设我调用过程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

+0

更好地使用COALESCE()而不是ISNULL()...首先,它可以有更多的参数(它返回第一个非空参数),第二,它是ANSI标准,而ISNULL不是。因此,您可以在每个SP的主体参数引用周围使用COALESCE,也可以创建一个新的局部变量并为其分配参数COALESCE(@ localExclude2 = COALESCE(@ exclude2,''))和使用本体SP中的本地副本。 – pmbAustin

回答

1

设置与case语句

@ exclude_new_1 = CASE新的参数时(@ exclude1 IS NULL)THEN'ELSE @ exclude1 END

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

+0

只需使用COALESCE就简单多了:“@ exclude_new_1 = COALESCE(@ exclude1,'');” – pmbAustin

+0

Touche。这^^^ – Lucky

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

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

相关问题