Условный оператор Где для табличного параметра? - PullRequest
9 голосов
/ 22 сентября 2010

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

1 Ответ

12 голосов
/ 22 сентября 2010

Вы пробовали:

   DECLARE @UseTVP int
   SET @UseTVP = (SELECT COUNT(*) FROM @TVP) 

   SELECT TOP 1 *
        FROM dbo.SomeTable tbl
            LEFT JOIN @TVP tvp
                ON tbl.SomeVar = tvp.SomeVar
        WHERE (tvp.SomeVar IS NOT NULL
               OR @UseTVP = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...