我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 ANDed:
CREATE PROCEDURE
MyProcedure
@LastName Varchar(30) = NULL,
@FirstName Varchar(30) = NULL,
@SSN INT = NULL
AS
SELECT LastName, FirstName, RIGHT(SSN,4) as SSN
FROM Employees
WHERE
(
(LastName like '%' + ISNULL(@LastName, '') + '%')
AND
(FirstName like '%' + ISNULL(@FirstName, '') + '%')
)
AND
(SSN = @SSN)
如果提供了@SSN,我只想执行 AND。还是有其他方法可以做到这一点?
如果提供了 SSN,则查询的 LastName/FirstName 部分将返回所有记录。如果只提供了姓/名,则 AND 会使其不会返回任何记录,因为 SSN 不会验证。
想法?
附加说明
假设一个基本记录集:
First Last SSN
Mike Smith 123456789
Tom Jones 987654321
如果我们改变上面的过程,使它不包括这个块:
AND
(SSN = @SSN)
然后一切正常,只要我们传递了名字或姓氏。但如果提供了 SSN,我希望能够包含 SSN。
如果我将 AND 更改为 OR,那么我会得到一个错误的结果集,因为查询的 FirstName/LastName 部分计算为:
WHERE (LastName like '%%' and FirstName like '%%')
(当然,这将返回所有记录)
如果我不能有条件地中止 AND,我希望得到类似的东西:
AND
(SSN like ISNULL(@SSN, '%'))
:-)