Это несколько продолжение к Slow Exists Check. Предложение Alex работает и успешно избегает повторения кода, но я все еще получаю вторую проблему. Рассмотрим пример ниже (от Алекса Кузнецова). В нем у меня есть две ветви, чтобы обрабатывать 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
Отличная находка. Получает мой +1 –
Отличная ссылка +1 –