Rus*_*tte 5 sql sql-server where
我正在尝试创建一个存储过程,允许省略参数,但如果提供了参数,则为AND:
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)
Run Code Online (Sandbox Code Playgroud)
如果提供了@SSN,我只想做AND.或者还有其他方法可以做到这一点吗?
如果提供了SSN,则查询的LastName/FirstName部分将返回所有记录.如果只提供了姓氏/名字,那么AND会使它不会返回任何记录,因为SSN不会验证.
想法?
额外的澄清
假设一个基本记录集:
First Last SSN
Mike Smith 123456789
Tom Jones 987654321
Run Code Online (Sandbox Code Playgroud)
如果我们改变上面的过程,那么它不包括这个块:
AND
(SSN = @SSN)
Run Code Online (Sandbox Code Playgroud)
如果我们传递了FirstName或LastName,那么一切都很好.但我希望能够包含SSN,如果有的话.
如果我将AND更改为OR,那么我得到一个错误的结果集,因为查询的FirstName/LastName部分evalute为:
WHERE (LastName like '%%' and FirstName like '%%')
Run Code Online (Sandbox Code Playgroud)
(当然,这将返回所有记录)
如果我不能有条件地中止AND,我希望有类似的东西:
AND
(SSN like ISNULL(@SSN, '%'))
Run Code Online (Sandbox Code Playgroud)
:-)
Red*_*ter 13
更改:
AND (SSN = @SSN)
Run Code Online (Sandbox Code Playgroud)
至:
AND (SSN = @SSN or @SSN is null)
Run Code Online (Sandbox Code Playgroud)
如果SSN永远不为null,您还可以:
AND SSN = ISNULL(@SSN, SSN)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5597 次 |
| 最近记录: |