3

テーブル値パラメーターを取り込み、それを IN ステートメント内で使用して結果を取得するストアド プロシージャを設定しようとしています。問題は、テーブル値パラメーターが空になる可能性があることです。方法はありますか? and ステートメント全体を条件付きで挿入する

declare @var int
--insert @var
declare @tvp tvp
--insert stuff (or not) into @tvp

SELECT t.foo1, t.foo2, t.foo3
FROM dbo.t t
WHERE t.foo4 = @var
IF(EXIST (SELECT 1 FROM @tvp)) 
   AND t.foo1 IN (SELECT @tvp.foo1 FROM @tvp)

これは私が概念的に目指しているものですが、これを行う適切な方法について何か助けはありますか?

4

3 に答える 3

4

あなたの論理に従うと、本当に括弧が必要です:

WHERE t.foo4 = @var OR
      (NOT EXISTS (SELECT 1 FROM @tvp) OR
       t.foo1 IN (SELECT @tvp.foo1 FROM @tvp)
      )
于 2015-04-24T12:09:44.587 に答える
3

このバージョンは、@tvp が空の場合でも結果が返されることを前提としています。@tvp が空であるか、t.foo1 が @tvp にあると表示されます。

WHERE t.foo4 = @var AND
(  
    NOT EXISTS (SELECT 1 FROM @tvp) 
    OR t.foo1 IN (SELECT @tvp.foo1 FROM @tvp)
)
于 2015-04-24T12:19:52.880 に答える
1
declare @var int
--insert @var
declare @tvp tvp
--insert stuff (or not) into @tvp 
declare @tvpCount int = select count(*) from @tvp

SELECT distinct t.foo1, t.foo2, t.foo3
  FROM dbo.t t 
  join tvp
    on t.foo4 = @var
   and ( @tvpCount = 0 or t.foo1 = @tvp.foo1 )
于 2015-04-24T14:26:15.830 に答える