2015-04-24 3 views
3

Я пытаюсь настроить хранимую процедуру, в которой я беру параметр параметра таблицы и использую его внутри оператора IN для захвата результатов, проблема заключается в параметре значения таблицы empty, есть ли способ для меня условно вставить целое и утверждение?T-SQL условный оператор 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) 

Это то, что я собираюсь концептуально, любая помощь в отношении того, как правильно это сделать?

ответ

3

Эта версия предполагает, что результаты все равно должны быть возвращены, даже если @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) 
) 
+0

Работал как шарм, спасибо, наша дБА, оставляя команду программирования, чтобы узнать SQL, мы похожи на обезьян перед клавиатурой лол. – Kaylee

4

Следуя вашей логике, вы на самом деле нужно просто круглые скобки:

WHERE t.foo4 = @var OR 
     (NOT EXISTS (SELECT 1 FROM @tvp) OR 
     t.foo1 IN (SELECT @tvp.foo1 FROM @tvp) 
    ) 
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)