Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Errore di restituzione CTE

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:

  1. DA
  2. ON
  3. ISCRIVITI
  4. DOVE
  5. GRUPPO PER
  6. CON CUBO o CON ROLLUP
  7. AVERE
  8. SELEZIONA
  9. DISTINTA
  10. ORDINA PER
  11. 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