パラメータを省略できるストアド プロシージャを作成しようとしていますが、指定されている場合は 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)
@SSN が提供されている場合にのみ AND を実行したい。または、これを行う他の方法はありますか?
SSN が指定されている場合、クエリの LastName/FirstName 部分によってすべてのレコードが返されます。姓/名のみが提供された場合、AND は、SSN が検証されないため、レコードが返されないようにします。
アイデア?
追加説明
基本的なレコードセットを想定します。
First Last SSN
Mike Smith 123456789
Tom Jones 987654321
上記の手順を変更して、このチャンクが含まれないようにする場合:
AND
(SSN = @SSN)
FirstName または LastName が渡されれば、すべてうまくいきます。ただし、提供されている場合は、SSN を含めることができるようにしたいと考えています。
AND を OR に変更すると、クエリの FirstName/LastName 部分が次のように評価されるため、不適切な結果セットが得られます。
WHERE (LastName like '%%' and FirstName like '%%')
(もちろん、すべてのレコードが返されます)
AND を条件付きで中止できない場合は、次のようなことを望んでいます。
AND
(SSN like ISNULL(@SSN, '%'))
:-)