Jest to znana „funkcja” SQL Server. Nigdy nie zakładaj, że klauzula WHERE jest wykonywana przed klauzulą SELECT.
Zobacz:SQL Server powinien nie zgłaszaj nielogicznych błędów
Czasami są ku temu dobre powody. Rozważ połączenie dwóch stołów, gdzie A jest znacznie mniejsze niż B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Jeśli sprawdzisz wygenerowany plan zapytania, słusznie lub niesłusznie, serwer SQL prześle strumieniowo dane z A jako wiodące wiersze do połączenia z B. Robiąc to, wie, że wystarczy pobrać col2
i function on col1
. Może przynieść col1
po prostu w celu późniejszego uruchomienia funkcji lub dla czegoś tak trywialnego jak CAST, SQL Server może równie dobrze przekształcić dane podczas procesu przesyłania strumieniowego.
Jedno jest pewne, ta strategia sprawia, że SQL Server jest odrobinę szybszy w niektórych zapytaniach. Ale z czysto logicznej perspektywy nazwałbym to błędem.