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:
- DESDE
- ENCENDIDO
- ÚNETE
- DONDE
- AGRUPAR POR
- CON CUBO o CON ROLLUP
- TENER
- SELECCIONAR
- DISTINTO
- ORDENAR POR
- 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