Em
SQL Server
há Ordem de processamento lógico da instrução SELECT
, que determina quando os objetos definidos em uma etapa são disponibilizados para as cláusulas nas etapas subsequentes:- DE
- LIGADO
- PARTICIPE
- ONDE
- GRUPO POR
- COM CUBO ou COM ROLLUP
- TER
- SELECIONAR
- DISTINTO
- ORENDER POR
- PARTE SUPERIOR
É assim que sua consulta será processada e sua consulta ficará perfeitamente bem. Mas às vezes, o
SQL Server
decide não seguir esta ordem para otimizar sua consulta. No seu caso, o
SQL Server
pode estar simplesmente transformando/transformando sua consulta em outra e realizando a convert
função, antes de aplicar a função where isnumeric
filtragem. Se tornamos sua consulta um pouco mais complexa (mas ainda dando os mesmos resultados), o
SQL Server
está executando o código corretamente desta 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;
No seu caso (e é isso que estou fazendo em situações em que tipos diferentes são armazenados em uma coluna), você pode simplesmente usar TRY_CONVERT função:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1