我试图设置一个存储过程,其中我接受一个表值参数,并在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)这就是我在概念上要做的,在正确的方法上有什么帮助吗?
发布于 2015-04-24 12:19:52
这个版本假设即使@tvp为空,仍然应该返回结果。它说@tvp要么是空的,要么t.foo1是IN @tvp。
WHERE t.foo4 = @var AND
(
NOT EXISTS (SELECT 1 FROM @tvp)
OR t.foo1 IN (SELECT @tvp.foo1 FROM @tvp)
)发布于 2015-04-24 12:09:44
按照您的逻辑,您只需要括号:
WHERE t.foo4 = @var OR
(NOT EXISTS (SELECT 1 FROM @tvp) OR
t.foo1 IN (SELECT @tvp.foo1 FROM @tvp)
)发布于 2015-04-24 14:26:15
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 )https://stackoverflow.com/questions/29847165
复制相似问题