Это что-то вроде продолжения Slow Exists Check . Предложение Алекса работает и успешно избегает повторения кода, но у меня все еще остается вторая проблема. Рассмотрим пример ниже (от Алекса Кузнецова). В нем у меня есть две ветви, чтобы справиться с 1 противопоказанием. Если бы у меня было 2 необязательных ограничения, я бы получил 4 ветви. В основном, количество ветвей увеличивается экспоненциально с количеством ограничений.
С другой стороны, если я использую многозначную табличную функцию или иным образом использую временные таблицы, оптимизатор SQL-запросов не может мне помочь, поэтому дела идут медленно. Я несколько не доверяю динамическому SQL (и я слышал, что он тоже медленный).
Может кто-нибудь предложить предложения о том, как добавить больше ограничений, не добавляя много операторов if?
Примечание: Ранее я пробовал просто соединить x is null or inpo = @inpo
вместе, но это очень медленно. Имейте в виду, что хотя тест inpo = @inpo
может быть обработан с помощью некоторого рода индексирования черной магии, тест на недействительность в конечном итоге будет оцениваться для каждой строки в таблице.
IF @inpo IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END
Вариант два: 2 ограничения:
IF @inpo IS NULL BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo2 = @inpo2
ORDER BY c;
END
END ELSE BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo AND
inpo2 = @inpo2
ORDER BY c;
END
END