2015-06-22 3 views
0

У меня есть элемент управления CheckBoxList в веб-форме, который дает все 7 рабочих дней. становится параметром в хранимой процедуре в SQL Server, как часть моего ИНЕКЕ:Короткое замыкание, необходимое при передаче параметра

AND (@Weekdays = 'MONDAY|TUESDAY|WEDNESDAY|THURSDAY|FRIDAY|SATURDAY|SUNDAY|' 
    OR a.DAYOFWEEK in 
     (select value from dbo.convertDelimetedValueListIntoTable(@Weekdays, '|')) 
    ) 

, потому что 99% времени все 7 будням остаются проверяемого, Идея заключается в том, чтобы игнорировать это «И» и ускорить запрос. Так что я надеялся, что, используя логический оператор ИЛИ, я мог бы коротко замыкать вторую часть условия, когда первая часть вернулась. Но я обнаружил, что SQL Server не использует короткое замыкание.

Любые идеи о том, как «обходить» эту строку, когда выбраны все будние дни?

+1

Если вы создаете запрос в коде, то почему бы не освободить состояние перед передачей его в SQL? –

+0

Я угадываю причину, по которой вы хотите обойти эту функцию - производительность? Сначала вы можете разобрать это, чтобы он не выполнялся для каждой строки вашего основного запроса. Вы также можете сделать это намного быстрее, но это требует, чтобы вы разместили содержимое этой функции. У меня есть чувство кишки, это многозначная таблица, функция которой ужасно медленная. –

+0

Изменение запроса является лучшим решением, но если вы не можете, добавление ограничения t-sql в этом столбце должно позволить оптимизатору обходить это условие –

ответ

0

всегда мог бы использовать саз:

WHERE CASE 
    WHEN @Weekdays='MONDAY|TUESDAY|WEDNESDAY|THURSDAY|FRIDAY|SATURDAY|SUNDAY|' THEN 
    1=1 
    ELSE 
    a.DAYOFWEEK IN (SELECT value FROM dbo.convertDelimetedValueListIntoTable(@Weekdays, '|')) 
END 
+0

Я пробовал оператор CASE с условием 1 = 1, но я продолжаю получать следующее сообщение об ошибке: неправильный синтаксис рядом с '=' –

Смежные вопросы