Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Erro ao retornar CTE


Em SQL ServerOrdem 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:
  1. DE
  2. LIGADO
  3. PARTICIPE
  4. ONDE
  5. GRUPO POR
  6. COM CUBO ou COM ROLLUP
  7. TER
  8. SELECIONAR
  9. DISTINTO
  10. ORENDER POR
  11. 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