Я создаю запрос, который имеет набор необязательных параметров, некоторые из которых являются параметрами с табличными значениями. Проблема, с которой я столкнулся, заключается в том, как наиболее эффективно использовать 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)