Échec de la Conversion lors de la conversion de la valeur nvarchar à un type de données int
J'ai une question que je vais tenter de vérifier la scode
colonne pour une gamme de numéros de code. Le problème est le scode
colonne contient certains caractères de type nvarchar, et des erreurs lorsqu'il en trouve.
Comment puis-je exécuter la requête suivante, sans retour d'erreurs.
SELECT dtExpires, dtFirst
FROM Customers
WHERE (scode BETWEEN 10 AND 100) OR
(scode BETWEEN 500 AND 600)
Erreur que je reçois:
Conversion a échoué lors de la conversion de la valeur nvarchar à un type de données int
quel est le type de données de la scode ? Semble nvachar
Arrêter de stocker des nombres dans les colonnes nvarchar!
Malheureusement je n'ai pas tout dire. Je suis tout simplement l'exécution de requêtes sur les données.
Arrêter de stocker des nombres dans les colonnes nvarchar!
Malheureusement je n'ai pas tout dire. Je suis tout simplement l'exécution de requêtes sur les données.
OriginalL'auteur Shmewnix | 2013-02-27
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas FIXER LE TYPE de DONNÉES qui est vraiment ce que vous DEVRIEZ faire...
La seule façon fiable de court-circuit des trucs filtré les résultats dans une table #temp. Sinon, vous n'avez aucun contrôle sur l'ordre d'évaluation. Même si vous utilisez une sous-requête ou CTE pour filtrer les lignes où
ISNUMERIC() = 1
"première", SQL Server peut évaluer laBETWEEN
conditionnelle d'abord, et de ne toujours pas avec la même erreur. Cela peut ne pas toujours arriver, mais c'est la seule façon d'être sûr de l'éviter:OriginalL'auteur Aaron Bertrand
Votre ultime problème, c'est que vous êtes le stockage de ces valeurs que
nvarchar
. Cette situation est problématique pour plusieurs raisons, la première est la vitesse. Il y a des tonnes de documents et les réponses à y montrer c'est le cas de nombreux d'entre eux sur cette très Site web.Entier les valeurs sont plus petites que les chaînes de caractères que vous pouvez adapter beaucoup plus par page que vous pouvez avec
nvarchar
et les mathématiques sont les plus facile à faire sur les nombres entiers. Essayez un peu d'expérience d'aller à SQLFiddle et entrez votre table et lui donne quelques valeurs et d'exécuter votre requête. Ensuite, essayez de changer la colonne à une valeur entière et exécute la même requête non seulement il va courir plus vite, mais votreSELECT
instruction s'exécute correctement. Si jamais vous avez besoin d'adhérer à ces informations et en entier me sera bien plus rapide.Je ne suis pas entièrement sûr de la météo ou non vous avez le pouvoir de faire cela ou pas, mais il va certainement résoudre votre problème et d'améliorer vos performances de base de données.
OriginalL'auteur Zane
Peut-être utiliser quelque chose comme
où la fonction est :
ou si vous souhaitez exclure les entrées où scode n'est pas numérique, faire également un bool retour de fonction qui vous dira si elle a des caractères numériques et de le mettre dans la clause where.
aussi une façon de résoudre ce pourrait être: (a inspiré un peu lil d'Aron
SELECT FROM (SELECT ... WHERE ISNUMERIC()=1) x WHERE
il peut évaluer que l'extérieur de la clause where de la première et de ne toujours pas.Aussi l'ajout de cette fonction va être extrêmement lente, et ne renvoie pas les résultats souhaités. Est
1x2
qui est changé à12
vraiment censé revenir entre 10 et 100?oui .. mais je l'ai dit .. aussi pour ajouter une autre fonction, c'est soit le premier ou les deux (ne pas obtenir l'erreur dont vous parlez) Lent, je l'avoue .. il peut être lente si vous cochez sur un trop grand nombre de lignes sans les autres filtres ..
Mon point était d'ajouter une clause where pour exclure les non-numérique scode valeurs peut sembler comme une chose logique à faire, mais il ne sera pas nécessairement le faire - il peut-être essayer d'évaluer le filtre ENTRE en premier. Alors, comment fait-il de l'aide?
Vous n'avez pas le temps de tester le code que vous êtes à poster une réponse? Donc tout le monde qui veut essayer votre code peut gaspiller leur temps de le tester? C'est égoïste, n'est-ce pas, compte tenu de combien de temps vous avez passé à vous disputer avec moi au sujet de votre "solution"?
OriginalL'auteur Dumitrescu Bogdan