0

私の見出しが非常に明確である場合は申し訳ありません。ストアド プロシージャを作成しようとしています:

Create Procedure Pro1 @a nvarchar = null, @b nvarchar =null
as
Select * from table1
where Parameter1 = '1'
and Parameter2 = @a
go

上記は実際のコードではありませんが、私が達成しようとしていることを説明してくれることを願っています. 私は2つのパラメータを選択しています。'Parameter2' は変数 @a に依存します。私が抱えている課題は、実行時に @a が null のままである場合です。「and」ステートメントが存在しないかのように、select ステートメントで Parmeter2 のすべての値を検索する必要があります。さまざまな選択を実行する if else ステートメントを作成することはできますが、@a を何らかのワイルドカード値に設定するだけでこれを実行できると思っていましたか? たぶん何か:「[]のように」?

4

1 に答える 1

2
CREATE PROCEDURE dbo.Pro1 -- use schema prefix when creating objects!
  @a NVARCHAR(32) = NULL -- 32 should match data type of Parameter2 column
AS
BEGIN -- wrap your body and indent for readability
  SET NOCOUNT ON; -- should always turn off DONE_IN_PROC messages

  SELECT columns -- please name your columns instead of SELECT *
    FROM dbo.table1 -- use schema prefix when referencing objects
    WHERE (Parameter2 = @a OR @a IS NULL); -- semi-colons please!
END
GO

場合によっては、これらのオプション パラメーターが多数ある場合、SQL Server は 1 セットのパラメーターに対して計画をコンパイルし、その計画はさまざまなパラメーターに対してあまり有益ではないことに気付く場合があります。したがって、次のようなものが必要になる場合があります。

CREATE PROCEDURE dbo.Pro1
  @a NVARCHAR(32) = NULL
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'SELECT columns FROM dbo.table1 WHERE 1=1';

  IF @a IS NOT NULL
    SET @sql += ' AND Parameter2 = @a';

  EXEC sp_executesql @sql,
    N'@a NVARCHAR(32)',
    @a;
END
GO
于 2013-07-18T15:25:54.160 に答える