J'ai une requête que je viens de trouver dans la base de données qui ne réussit pas à faire tomber un rapport. L'essentiel de base de la requête:Comment puis-je interroger «entre» des données numériques sur un champ non numérique?
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
Maintenant, myField ne contient pas de données numériques dans toutes les lignes [il est de type nvarchar] ... mais cette requête a été évidemment conçu de telle sorte qu'il ne se soucie que sur les lignes où les données dans ce champ sont numériques.
Le problème est que T-SQL (près de ce que je comprends) ne pas le cas court-circuit provoquant ainsi l'article à un fossé sur les dossiers où les données ne sont pas numérique à l'exception:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the nvarchar value '/A' to data type int.
À court de dumping toutes les lignes où myField est numérique dans une table temporaire, puis interroger cela pour les lignes où le champ est dans la plage spécifiée, que puis-je faire c'est optimal?
Ma première analyse syntaxique uniquement pour tenter d'analyser les données renvoyées et voir ce qui se passait était:
Select *
From (
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
Mais je reçois la même erreur, je l'ai fait pour la première requête que je ne suis pas sûr que je comprends car je ne convertis aucune donnée qui ne devrait pas être numérique à ce stade. La sous-requête doit uniquement renvoyer des lignes où myField contient des données numériques.
Peut-être que j'ai besoin de mon thé du matin, mais est-ce que cela a du sens pour n'importe qui? Un autre ensemble d'yeux aiderait.
Merci à l'avance
La table dérivée ne soit pas matérialisée d'abord, puis la clause 'WHERE' appliquée. Il est traité plus comme une vue où l'optimiseur réécrira simplement le 2ème pour être comme le premier à partir d'une algèbre relationnelle POV ils sont les mêmes. –
Selon [cette page] (http://msdn.microsoft.com/en-us/library/aa226054 (SQL.80% 29.aspx), il n'est pas nécessaire de convertir explicitement 'nvchar' en' int'. – NullUserException