Условный оператор Where для параметра с табличным значением?

Я создаю запрос, который имеет набор необязательных параметров, некоторые из которых являются параметрами с табличными значениями. Проблема, с которой я столкнулся, заключается в том, как наиболее эффективно использовать TVP в этом запросе?

Каждый TVP имеет тип:

TABLE( [variable] nvarchar(30))

Я знаю, что обычно могу:

INNER JOIN @TVP

, чтобы отфильтровать все, чего нет в списке TVP, но что, если я решу не передавать какие-либо значения в TVP в моем запросе? Тогда ничего не будет возвращено (из-за внутреннего соединения)

Обычно это достигается с помощью условного оператора where:

WHERE (SomeVar = @SameVar OR @SameVar IS NULL)

Но с TVP он не может быть нулевым (по крайней мере, я не нашел)

Я нашел один способ добиться этого:

OUTER APPLY
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in 
(select * from @TVP) or not exists (select * from @TVP)
AND tbl.SomeVar = SomeVar)

К сожалению, этот метод ужасно медленный

В качестве альтернативы я пробовал:

WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP))

Это НАМНОГО быстрее, но я все еще чувствую, что он может быть не идеальным

Мы будем благодарны за любую помощь или мысли! Дайте мне знать, если я могу что-то уточнить .... Заранее спасибо

EDIT:

Итак, я придумал это и, вероятно, буду использовать его, если у кого-то не будет лучшего решения:

INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)
9
задан Brett 22 September 2010 в 08:34
поделиться