0

次のようなストアド プロシージャがあるとします。

CREATE PROCEDURE People_Select
    @LastName   nvarchar(25)    = NULL,
    @FirstName  nvarchar(25)    = NULL,
AS
BEGIN 

    SET NOCOUNT ON;

    SELECT *
    FROM People
    WHERE (@LastName IS NULL OR (LastName = @LastName))
      AND (@FirstName IS NULL OR (FirstName = @FirstName))

    OPTION (RECOMPILE)

END

これが実行され、パラメータの少なくとも 1 つ (または両方) が設定されている場合、完全に機能します。ただし、どちらのパラメーターも設定せずに呼び出した場合、People テーブルからすべての行が返されます。これは特に、People テーブルに何百万ものレコードがある場合に問題になります。

(私の場合)好ましい機能は、パラメータが設定されていない場合、何も返さないことです。lastName が null かどうか、および firstname が null で何も返さないかどうかを簡単に確認できますが、これを行うよりエレガントな方法はありますか? ストアド プロシージャに 20 個のオプション パラメータがあるとしたらどうなるでしょうか。それらが最初にすべて null であるかどうかを確認して何も返したくない..もっと簡単な方法はありますか? ありがとう。

4

1 に答える 1

0

以下を試してください

CREATE PROCEDURE People_Select
    @LastName   nvarchar(25)    = NULL,
    @FirstName  nvarchar(25)    = NULL,
AS
BEGIN 

    IF @LastName is null and @FirstName is null
        goto end_section:

    SET NOCOUNT ON;

    SELECT *
    FROM People
    WHERE (@LastName IS NULL OR (LastName = @LastName))
      AND (@FirstName IS NULL OR (FirstName = @FirstName))

    OPTION (RECOMPILE)
end_section:
END
于 2013-06-06T14:44:42.697 に答える