In SQL Server
esiste Ordine di elaborazione logica dell'istruzione SELECT
, che determina quando gli oggetti definiti in un passaggio sono resi disponibili alle clausole nei passaggi successivi:
- DA
- ON
- ISCRIVITI
- DOVE
- GRUPPO PER
- CON CUBO o CON ROLLUP
- AVERE
- SELEZIONA
- DISTINTA
- ORDINA PER
- TOP
Questo è il modo in cui la tua query verrà elaborata e la tua query sembra perfettamente a posto. Ma a volte, il SQL Server
decide di non seguire questo ordine per ottimizzare la tua richiesta.
Nel tuo caso, SQL Server
potrebbe essere semplicemente trasformare/trasformare la tua query in un'altra ed eseguire la convert
funzione, prima di applicare il where isnumeric
filtraggio.
Se abbiamo reso la tua query un po' più complessa (ma continuando a fornire gli stessi risultati), il SQL Server
sta eseguendo il codice correttamente questa volta:
;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;
Nel tuo caso (e questo è ciò che sto facendo in tali situazioni quando tipi diversi sono archiviati in una colonna), puoi semplicemente utilizzare TRY_CONVERT funzione:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1