I SQL Server
der er Logisk behandlingsrækkefølge for SELECT-sætningen
, som bestemmer, hvornår de objekter, der er defineret i ét trin, gøres tilgængelige for klausulerne i efterfølgende trin:
- FRA
- TIL
- DELTAG
- HVOR
- GRUPPER EFTER
- Med TERNING eller MED ROLLUP
- HAR
- VÆLG
- DISTINKT
- BEstil efter
- TOP
Sådan vil din forespørgsel blive behandlet, og din forespørgsel ser helt fin ud. Men nogle gange er SQL Server
beslutter ikke at følge denne rækkefølge for at optimere din forespørgsel.
I dit tilfælde er SQL Server
kan være simpelthen at omdanne/transformere din forespørgsel til en anden og udføre convert
funktion, før du anvender where isnumeric
filtrering.
Hvis vi gjorde din forespørgsel lidt mere kompleks (men stadig giver de samme resultater), vil SQL Server
udfører koden korrekt denne gang:
;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;
I dit tilfælde (og det er det, jeg gør i sådanne situationer, hvor forskellige typer er gemt i én kolonne), kan du blot bruge 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