Вопрос

У меня есть следующее утверждение:

SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result 

Я просто хочу подтвердить, что в этом случае функция не будет выполнена?

Моя причина спрашивать заключается в том, что функция работает особенно медленно, и если критерия верна, я хочу избежать вызова функции...

Приветствия Энтони

Это было полезно?

Решение

Не делайте этого предположения, это НЕПРАВИЛЬНО.Оптимизатор запросов полностью свободен в выборе порядка вычисления по своему усмотрению, а SQL как язык НЕ допускает короткого замыкания оператора.Даже если при тестировании вы обнаружите, что функция никогда не вычисляется, в рабочей среде вы можете время от времени сталкиваться с условиями, которые заставляют сервер выбирать другой план выполнения и сначала вычислять функцию, а затем остальную часть выражения.Типичным примером может быть ситуация, когда сервер замечает, что возвращаемый функцией результат является детерминированным и не зависит от данных строки, и в этом случае он сначала оценивает функцию, чтобы получить значение, и после которые запускают сканирование таблицы и оценивают критерии включения WHERE, используя заранее определенное значение функции.

Другие советы

Ваше предположение верно - оно не будет выполнено.Я понимаю ваше беспокойство, но конструкция CASE в этом смысле "умна" - она не оценивает никаких условий после первого допустимого условия.Вот пример, подтверждающий это.Если бы обе ветви этого оператора case были выполнены, вы бы получили ошибку "разделить на ноль":

SELECT  CASE
                WHEN 1=1 THEN 1
                WHEN 2=2 THEN 1/0
            END AS ProofOfConcept

Есть ли в этом смысл?

Предполагая, что вы проводите какое-то тестирование...Если вы пытаетесь избежать at_Test_Function, почему бы просто не закомментировать это и не сделать

SELECT 10 AS Result

Поставьте WaitFor Delay '00:00:05' в функции.Если оператор возвращается немедленно, он не выполнялся, если для возврата требуется 5 секунд, значит, он был выполнен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top