Рассмотрим эту установку:SQL Server: функция приоритета и короткий curcuiting в котором пункт
create table #test (val varchar(10))
insert into #test values ('20100101'), ('1')
Теперь, если я выполнить этот запрос
select *
from #test
where ISDATE(val) = 1
and CAST(val as datetimeoffset) > '2005-03-01 00:00:00 +00:00'
он потерпит неудачу с
конверсии не удалось при преобразовании даты и/или времени из строки символов
, который сообщает мне, что условия where
не закорочены и обе функции оцениваются. ОК.
Однако, если я бегу
select *
from #test
where LEN(val) > 2
and CAST(val as datetimeoffset) > '2005-03-01 00:00:00 +00:00'
он не подведет, который говорит мне, что where
положение закорочен в этом случае.
Этот
select *
from #test
where ISDATE(val) = 1
and CAST(val as datetimeoffset) > '2005-03-01 00:00:00 +00:00'
and LEN(val) > 2
снова не удастся, но если я перееду проверку длины к перед тем бросить, это работает. Так выглядит, как функции оцениваются в том порядке, в котором они появляются в запросе.
Может кто-нибудь объяснить, почему первый запрос не удается?
Я должен был посмотреть на план выполнения – user227895