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 :
- DE
- ON
- JOIGNEZ-VOUS
- OÙ
- GROUPER PAR
- AVEC CUBE ou AVEC ROLLUP
- AVOIR
- SÉLECTIONNER
- DISTINCT
- COMMANDER PAR
- 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