W SQL Server
istnieje Kolejność przetwarzania logicznego instrukcji SELECT
, który określa, kiedy obiekty zdefiniowane w jednym kroku są udostępniane klauzulom w kolejnych krokach:
- OD
- WŁ
- DOŁĄCZ
- GDZIE
- GRUPUJ WG
- Z KOSTKĄ LUB Z ROLKĄ
- POSIADAJĄC
- WYBIERZ
- ODRÓŻNE
- ZAMÓW PRZEZ
- GÓRA
W ten sposób Twoje zapytanie zostanie przetworzone, a Twoje zapytanie wygląda idealnie. Czasami jednak SQL Server
postanawia nie przestrzegać tej kolejności w celu optymalizacji zapytania.
W Twoim przypadku SQL Server
może być po prostu przekształcaniem/przekształcaniem zapytania w inne i wykonywaniem convert
funkcji, przed zastosowaniem where isnumeric
filtracja.
Jeśli sprawiliśmy, że Twoje zapytanie stało się nieco bardziej złożone (ale nadal daje te same wyniki), SQL Server
tym razem poprawnie wykonuje kod:
;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;
W Twoim przypadku (i to właśnie robię w takich sytuacjach, gdy różne typy są przechowywane w jednej kolumnie), możesz po prostu użyć TRY_CONVERT funkcja:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1