I SQL Server
det finns logisk bearbetningsordning för SELECT-satsen
, som bestämmer när objekten som definieras i ett steg görs tillgängliga för satserna i efterföljande steg:
- FRÅN
- PÅ
- GÅ MED
- VAR
- GRUPPER EFTER
- Med KUB eller MED ROLLUP
- HA
- VÄLJ
- DISTINKT
- BESTÄLL AV
- TOPP
Så här kommer din fråga att bearbetas och din fråga ser helt ok ut. Men ibland, SQL Server
bestämmer sig för att inte följa denna ordning för att optimera din fråga.
I ditt fall, SQL Server
kan vara att helt enkelt konvertera/omvandla din fråga till en annan och utföra convert
funktion, innan du använder where isnumeric
filtrering.
Om vi gjorde din fråga lite mer komplex (men fortfarande ger samma resultat), kan SQL Server
exekverar koden korrekt den här gången:
;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 ditt fall (och det är vad jag gör i sådana situationer när olika typer är lagrade i en kolumn), kan du helt enkelt använda 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