Когда вы создаете запрос, подобный тому, который вы пытаетесь, оптимизатору запросов потребуется создать один план, чтобы соответствовать любому значению параметров. Это приведет к худшему из возможных планов. Таким образом, даже если вы придумали правильное выражение (используя CASE), запрос будет очень плохо выполняться из-за противоречивых условий ИЛИ.
Разделите операторы IF на условия SQL и используйте отдельные запросы для каждого случая:
IF @booked_in IS NULL and @depot_assigned IS NULL
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
ELSE IF @depot_assigned IS NULL
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
AND booked_in = @booked_in
ELSE IF @booked_in IS NULL AND @depot_code='Y'
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
AND depot_code <> ' '
ELSE IF IF @booked_in IS NULL AND @depot_code<>'Y'
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
AND depot_code = ' '
ELSE IF @depot_code = 'Y'
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
AND booked_in = @booked_in
AND depot_code <> ' '
ELSE
SELECT * FROM sales_order_header
WHERE order_reference LIKE @order_reference + '%'
AND booked_in = @booked_in
AND depot_code = ' '
Несмотря на кажущееся уродство и отсутствие элегантности, это лучший подход. Его основной недостаток - проблемы с обслуживаемостью, а также устранение существенной альтернативы в использовании динамического SQL для построения запроса.
В конечном счете, сложность условий IF заключается в том, что ваш API доступа к данным делает слишком много вещей, которые должны быть отдельными точками входа API.