1

これを行う正しい方法は何ですか?たとえば、次のシグネチャを使用してストアド プロシージャを変更するにはどうすればよいでしょうか。

CREATE PROCEDURE dbo.MyProcedure
  @Param BIT = NULL
AS
  SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = @Param

@Param に 1 または 0 の値を指定するとフィルターが実行されますが、それを指定しないか NULL を渡すとフィルター処理は実行されませんか?

4

3 に答える 3

5

NULL が「ドントケア」を意味すると仮定すると、

CREATE PROCEDURE dbo.MyProcedure 
   @Param BIT = NULL
AS
   SELECT *
   FROM dbo.SomeTable T
   WHERE T.SomeColumn = @Param OR @Param IS NULL
于 2008-10-10T15:48:32.953 に答える
1

複数の方法があります。ここに1つあります:

SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = COALESCE(@Param, T.SomeColumn)

ただし、これには T.SomeColumn が NULL である行は含まれません。

次の代替案には、これらの行が含まれます。

SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = @Param OR @Param IS NULL

ただし、パラメーターが繰り返されるという欠点があります。これは、プレースホルダーを使用するなど、別の方法でパラメーターを渡す場合には適していません。

于 2008-10-10T16:30:16.910 に答える
0

これを行う最もクリーンな方法は(T-SQLで)次のとおりだと思います。

SELECT * FROM TABLE WHERE column = ISNULL(@param, column)

他の RDBMS は、ISNULL ではなく COALESCE を優先します。

特に他の OR 句を追加し始めると、ここでの意図がより明確になると思います。また、AND 句と組み合わせるときに括弧が必要なくなります。

私の (非常に) 限定的なテストでは、ISNULL と OR @p IS NULL を使用した場合のパフォーマンスの向上も無視できました。パフォーマンスの向上のためにISNULL の使用を推奨しているわけではありません(これはせいぜい非常にわずかであり、最悪の場合は非常に特殊なケースに限定されます)。率直に言って、どちらの方法でも違いが生じる理由はわかりませんが、実行計画では、フィルター コストで約 1% の違いが示されています。

于 2008-10-10T16:29:39.437 に答える