sql >> Base de Datos >  >> RDS >> Sqlserver

Error de devolución de CTE

En SQL Server hay Orden de procesamiento lógico de la declaración SELECT , que determina cuándo los objetos definidos en un paso se ponen a disposición de las cláusulas en pasos posteriores:

  1. DESDE
  2. ENCENDIDO
  3. ÚNETE
  4. DONDE
  5. AGRUPAR POR
  6. CON CUBO o CON ROLLUP
  7. TENER
  8. SELECCIONAR
  9. DISTINTO
  10. ORDENAR POR
  11. ARRIBA

Así es como se procesará su consulta y su consulta se ve perfectamente bien. Pero a veces, el SQL Server decide no seguir este orden para optimizar su consulta.

En su caso, el SQL Server podría ser simplemente transformar/transformar su consulta en otra y realizar convert función, antes de aplicar el where isnumeric filtración.

Si hicimos su consulta un poco más compleja (pero aún dando los mismos resultados), el SQL Server está ejecutando el código correctamente esta vez:

;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;

En su caso (y esto es lo que estoy haciendo en tales situaciones cuando se almacenan diferentes tipos en una columna), simplemente puede usar TRY_CONVERT función:

;with isnum AS ( 
SELECT result 
FROM #temp 
WHERE ISNUMERIC(result) = 1)

SELECT 
    result, 
    ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1