In SQL Server
er is Logische verwerkingsvolgorde van de SELECT-instructie
, die bepaalt wanneer de objecten die in één stap zijn gedefinieerd, beschikbaar worden gesteld aan de clausules in volgende stappen:
- VAN
- AAN
- DOEN
- WAAR
- GROEPEREN OP
- MET KUBUS of MET ROLLUP
- HEBBEN
- SELECTEER
- VERSCHILLEND
- BESTEL DOOR
- TOP
Dit is hoe uw vraag wordt verwerkt en uw vraag ziet er prima uit. Maar soms kan de SQL Server
besluit deze volgorde niet te volgen om uw zoekopdracht te optimaliseren.
In uw geval de SQL Server
kan uw zoekopdracht eenvoudigweg in een andere omzetten/transformeren en de convert
. uitvoeren functie, voordat u de where isnumeric
. toepast filteren.
Als we uw zoekopdracht iets complexer hebben gemaakt (maar nog steeds dezelfde resultaten geeft), zal de SQL Server
voert de code deze keer correct uit:
;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 jouw geval (en dit is wat ik doe in dergelijke situaties waarin verschillende typen in één kolom zijn opgeslagen), kun je eenvoudig TRY_CONVERT functie:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1