Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Erreur de retour CTE

Dans SQL Server il existe ordre de traitement logique de l'instruction SELECT , qui détermine quand les objets définis dans une étape sont mis à disposition des clauses dans les étapes suivantes :

  1. DE
  2. ON
  3. JOIGNEZ-VOUS
  4. GROUPER PAR
  5. AVEC CUBE ou AVEC ROLLUP
  6. AVOIR
  7. SÉLECTIONNER
  8. DISTINCT
  9. COMMANDER PAR
  10. HAUT

C'est ainsi que votre requête va être traitée et votre requête semble parfaitement correcte. Mais parfois, le SQL Server décide de ne pas suivre cet ordre afin d'optimiser votre requête.

Dans votre cas, le SQL Server pourrait simplement transformer/transformer votre requête en une autre et effectuer la convert fonction, avant d'appliquer le where isnumeric filtration.

Si nous avons rendu votre requête un peu plus complexe (mais donnant toujours les mêmes résultats), le SQL Server exécute correctement le code cette fois :

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

Dans votre cas (et c'est ce que je fais dans de telles situations lorsque différents types sont stockés dans une colonne), vous pouvez simplement utiliser TRY_CONVERT fonction :

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

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