Я создаю SQL-запрос, в котором мне нужно условное выражение where
пункт.
Это должно быть что-то вроде этого:
SELECT
DateAppr,
TimeAppr,
TAT,
LaserLTR,
Permit,
LtrPrinter,
JobName,
JobNumber,
JobDesc,
ActQty,
(ActQty-LtrPrinted) AS L,
(ActQty-QtyInserted) AS M,
((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N
FROM
[test].[dbo].[MM]
WHERE
DateDropped = 0
--This is where i need the conditional clause
AND CASE
WHEN @JobsOnHold = 1 THEN DateAppr >= 0
ELSE DateAppr != 0
END
Вышеупомянутый запрос не работает. Разве это не правильный синтаксис или является там другим способом сделать это, что я не знаю?
Я не хочу использовать динамический SQL, так есть ли любой другой путь, или сделайте я должен использовать обходное решение как использование if else
и использование того же запроса с различным where
пункты?
Часто при использовании условных операторов Where, Вы заканчиваете upp весьма неэффективным запросом, который примечателен для больших наборов данных, где индексы используются. Отличный способ к оптимизирует запрос для различных значений Вашего параметра , должен сделать другой план выполнения относительно каждого значения параметра. Можно достигнуть этого использования OPTION (RECOMPILE)
.
В этом примере это, вероятно, не имело бы большого значения, но сказало бы, что условие должно только использоваться в одном из двух случаев, затем Вы могли заметить большое влияние.
В этом примере:
WHERE
DateDropped = 0
AND (
(ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0)
OR
(ISNULL(@JobsOnHold, 0) <> 1 AND DateAppr <> 0)
)
OPTION (RECOMPILE)
Источник Сниффинг Параметра, Встраивание и ПЕРЕКОМПИЛИРОВАТЬ Опции