In SQL Server
es gibt Logische Verarbeitungsreihenfolge der SELECT-Anweisung
, die bestimmt, wann die in einem Schritt definierten Objekte den Klauseln in nachfolgenden Schritten zur Verfügung gestellt werden:
- VON
- EIN
- MITMACHEN
- WO
- GRUPPE NACH
- MIT CUBE oder MIT ROLLUP
- HABEN
- AUSWÄHLEN
- DISTINKT
- BESTELLEN VON
- TOP
So wird Ihre Abfrage verarbeitet und Ihre Abfrage sieht vollkommen in Ordnung aus. Aber manchmal der SQL Server
beschließt, dieser Reihenfolge nicht zu folgen, um Ihre Abfrage zu optimieren.
In Ihrem Fall der SQL Server
könnte darin bestehen, Ihre Abfrage in eine andere zu vereinfachen/umzuwandeln und die convert
durchzuführen -Funktion, bevor Sie where isnumeric
anwenden filtern.
Wenn wir Ihre Abfrage etwas komplexer gemacht haben (aber immer noch die gleichen Ergebnisse liefern), wird der SQL Server
führt den Code dieses Mal korrekt aus:
;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;
In Ihrem Fall (und das mache ich in solchen Situationen, wenn verschiedene Typen in einer Spalte gespeichert sind) können Sie einfach TRY_CONVERT Funktion:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1