Работая над этой конкретной ситуацией, для меня стало новостью, что логические операторы не замыкаются накоротко в SQL.
Я обычно делаю что-то подобное в предложении where (обычно при работе с поисковыми запросами).):
WHERE
(@Description IS NULL OR @Description = myTable.Description)
Что, даже если в этом примере оно не замкнуто, не имеет большого значения.Однако при работе с полнотекстовыми поисковыми функциями это имеет значение. Если вторая часть этого запроса была CONTAINS(myTable.Description, @Description)
, она не будет работать, поскольку переменная не может быть пустой или пустой для этих функций.
Я обнаружил, что WHEN
операторы CASE
выполняются по порядку, поэтому я могу изменить свой запрос следующим образом, чтобы полнотекстовый поиск вызывался только при необходимости, наряду с изменением переменной с нуля на '""'
когда разрешено выполнение запроса: null:
WHERE
(CASE WHEN @Description = '""' THEN 1 WHEN CONTAINS(myTable.Description, @Description) THEN 1 ELSE 0 END = 1)
Приведенный выше код должен препятствовать выполнению части полнотекстового запроса, если только нет фактического значения для поиска.
MyВопрос в том, что если я выполню этот запрос, где @Description равен '""'
, в плане выполнения все еще будет довольно много времени, затрачиваемого на поиск кластеризованного индекса и полное совпадение текста, даже если эта таблица и поиск не будут использоваться привсе: есть ли способ избежать этого?
Я пытаюсь получить это из жестко закодированного динамического запроса вЕсли процедура заканчивается медленнее, я не уверен, что смогу это оправдать.