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