10 votes

Erreur de conversion du type de données varchar

J'ai actuellement une table avec une colonne comme varchar . Cette colonne peut contenir des chiffres ou du texte. Lors de certaines requêtes, je la traite comme une bigint (je fais une jointure entre cette colonne et une colonne dans une autre table qui est bigint )

Tant qu'il n'y avait que des chiffres dans ce champ, je n'avais pas de problème, mais dès qu'une seule ligne contenait du texte et non des chiffres dans ce champ, j'obtenais le message "Error converting data type". varchar a bigint ." même si, dans la partie WHERE, je me suis assuré qu'aucun des champs de texte n'apparaissait.

Pour résoudre ce problème, j'ai créé une vue comme suit :

SELECT     TOP (100) PERCENT ID, CAST(MyCol AS bigint) AS MyCol
FROM         MyTable
WHERE     (isnumeric(MyCol) = 1)

Mais même si la vue n'affiche que les lignes avec des valeurs numériques et convertit Mycol en bigint, j'obtiens toujours un message d'erreur. Erreur de conversion du type de données varchar en bigint lors de l'exécution de la requête suivante :

SELECT * FROM MyView where mycol=1

Lorsque l'on fait des requêtes sur la vue, on ne doit pas savoir ce qui se passe derrière ! on doit simplement voir deux champs de type bigint ! ( voir l'image ci-jointe même mssql management studio montre que les champs de la vue sont des bigint).

0voto

Regent Points 3314

Avez-vous essayé de convertir le champ bigint d'une autre table en varchar ? Pour moi, il est logique d'effectuer une conversion plus robuste... Cela ne devrait pas trop affecter vos performances si le champ varchar est indexé.

0voto

alexus Points 2684

Pensez à créer un champ bigint redondant pour contenir la valeur entière de af MyCol.

Vous pouvez alors indexer le nouveau champ pour accélérer la jointure.

0voto

Shiraz Bhaiji Points 34901

Essayez de faire la sélection en 2 étapes.

Je crée d'abord une vue qui sélectionne toutes les colonnes où ma colonne est numérique.

Ensuite, faites une sélection dans cette vue où vous lancez le champ Varchar.

L'autre chose que vous pourriez examiner est la conception de vos tables afin de supprimer la nécessité de la fonte.

EDITAR

  • Certains des nombres sont-ils plus grands que bigint ?
  • Y a-t-il des espaces, en tête, en queue ou dans le numéro ?
  • Y a-t-il des personnages de format ? Des points décimaux ?

0voto

Gertjan Points 752

Essayez d'utiliser ceci :

SELECT 
  ID, 
  CAST(MyCol AS bigint) as MyCol
FROM
(
  SELECT TOP (100) PERCENT 
      ID, 
      MyCol 
  FROM 
      MyTable 
  WHERE 
      (isnumeric(MyCol) = 1)
) as tmp

Cela devrait fonctionner puisque la sélection interne ne renvoie que des valeurs numériques et que la sélection externe peut donc convertir toutes les valeurs de la première sélection en valeurs numériques. Il semble que dans votre propre code, SQL essaie d'effectuer un cast avant d'exécuter la fonction isnumeric (cela a peut-être quelque chose à voir avec l'optimisation).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X