Toto je známá "funkce" SQL Server. Nikdy nepředpokládejte, že se klauzule WHERE spustí před klauzulí SELECT.
Viz:SQL Server by měl nevyvolává nelogické chyby
Někdy k tomu skutečně existují dobré důvody. Zvažte spojení dvou stolů, přičemž A je mnohem menší než B.
select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1
Pokud zkontrolujete vygenerovaný plán dotazů, správně nebo špatně, SQL server bude streamovat data z A jako první řádky, které se spojí s B. Přitom ví, že potřebuje pouze stáhnout col2
a function on col1
. Mohlo by to přinést col1
SQL Server může také transformovat data během procesu streamování, aby bylo možné funkci spustit později, nebo pro něco tak triviálního jako CAST.
Jedna věc je jistá, tato strategie dělá SQL Server o něco rychlejším v určitých dotazech. Ale z čistě logického hlediska bych to nazval bug.