Това е известна „функция“ на SQL Server. Никога не приемайте, че клаузата WHERE се изпълнява преди клаузата SELECT.
Вижте:SQL Server трябва не предизвиква нелогични грешки
Всъщност понякога има добри причини да го правите. Помислете за свързване на две таблици, като A е много по-малка от B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Ако инспектирате генерирания план на заявката, правилно или погрешно, SQL сървърът ще предава поточно данните от A като водещи редове, които да се съединят срещу B. Докато прави това, той знае, че трябва само да изтегли col2
и function on col1
. Може да доведе до col1
само за да изпълни функцията по-късно или за нещо толкова тривиално като CAST, SQL Server може също така да трансформира данните по време на процеса на поточно предаване.
Едно нещо е сигурно, тази стратегия наистина прави SQL Server малко по-бърз в определени заявки. Но от чисто логическа гледна точка бих го нарекъл грешка.