V SQL Server
existuje Logické pořadí zpracování příkazu SELECT
, který určuje, kdy jsou objekty definované v jednom kroku zpřístupněny klauzulím v následujících krocích:
- OD
- ZAPNUTO
- PŘIPOJIT SE
- KDE
- GROUP BY
- S KOSTKOU nebo S ROLLUP
- MÍT
- VYBRAT
- DISTINCT
- OBJEDNEJTE PODLE
- TOP
Takto bude váš dotaz zpracován a váš dotaz vypadá naprosto v pořádku. Někdy však SQL Server
se rozhodne neřídit se tímto příkazem, aby optimalizoval váš dotaz.
Ve vašem případě SQL Server
může jednoduše převést/převést váš dotaz na jiný a provést convert
před použitím funkce where isnumeric
filtrování.
Pokud jsme váš dotaz udělali trochu složitějším (ale stále dáváme stejné výsledky), SQL Server
tentokrát provádí kód správně:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1
GROUP BY result
HAVING MAX(result) = result
)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE CONVERT(INT,result) > 1;
Ve vašem případě (a to je to, co dělám v takových situacích, kdy jsou různé typy uloženy v jednom sloupci), můžete jednoduše použít TRY_CONVERT funkce:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1