パラメータに応じてストアドプロシージャ内のインクルード/エクスクルードデータの問題

ストアドプロシージャに行を含める必要があるかパラメータの値に依存しない問題がありました

  • if @var_exclude = 'Y' I need to show only rows that mytable.field1 = 'N'
  • if @var_exclude = 'N' I need to show all rows

私は次のクエリを使用していますが、正しく動作しません

私のコードは似ています

@var_exclude    varchar(1)

    select mytable.field1, mytable.field2, mytable.field3, mytable.field4,mytable.field5 
    from mytable
Where mytable.field6 is null
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and  mytable.field1 = Case when @var_exclude= 'Y' Then 'N' Else @var_exclude End
End

よくわかりません!

0
これは、ストア D プロシージャと呼ばれ、SQL Serverのストアとして、 "ストア"とは何の関係もありません。さらに、1文字しかない場合は、 CHAR(1)にする必要があります(少なくとも2バイトのオーバーヘッドを持つ VARCHAR(1) !)
追加された 著者 marc_s,

2 答え

@var_exclude を扱うロジックが間違っています。

@var_exclude = 'Y' を渡すと、クエリは基本的に次のように解決されます。

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

このケースでは、@ var_exclude = 'Y' Then のCASE句の部分が使用されるためです。

あなたが何か他のものを渡すならば、あなたはあなたが渡している価値を取ります。したがって、 @var_exclude = 'N' を渡すと、クエリは次のように解決されます。

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

この場合、CASE句の Else @var_exclude が使用され、 @var_exclude = 'N' のため、前と同じクエリが返されます。

私はおそらくこのような手順を書いています:

CREATE PROCEDURE dbo.GetData 
     @paramstate VARCHAR(???),
     @var_exclude CHAR(1)
AS BEGIN 
   IF @var_exclude = 'N' THEN
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')

   ELSE
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')
         AND t.field1 = 'N'
END
1
追加された
@ user1004299:なぜ効率的ではない?あるケースでは、この追加の制限がなければならないので、あなたができることは最高だと思うのですが、他のケースではそうではありません。そうでなければこれをモデル化する良い方法はありません... 。
追加された 著者 marc_s,
助けてくれてありがとう、私はこのように書いたが、私の質問はこのサンプルのように簡単ではないので効率的ではないと思うし、将来私はそれを維持するために非常に慎重にしなければならない。
追加された 著者 user1004299,

ちょっと、誰かがまだこのようなものを探しているなら、あなたは実際にwhere句でそれを行うことができます.IN文を書いて、次のように条件を評価する必要があります:

DECLARE @Include bit
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)

したがって、これは評価されます:

IF @Include = 1 THEN 0,1
ELSEIF @Include = 0 THEN 0
END

ですから、WHERE節にIN句を書くだけです。

SELECT * FROM store 
WHERE values IN (
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)
)

私はこれが将来誰にでも役立つことを願っています!

0
追加された