3

我正在尝试设置一个存储过程,我在其中接收表值参数并在 IN 语句中使用它来获取结果,问题是表值参数可以为空,有没有办法让我有条件地插入一个完整的和语句?

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 回答