web-dev-qa-db-fra.com

La valeur n'a pas pu être convertie en raison d'une perte potentielle de données

Permettez-moi de commencer par clarifier que ce n'est pas une question en double, ni un doublon potentiel d'ailleurs. J'ai essayé d'implémenter chaque réponse à chaque variante qui existe déjà de ce problème sur StackOverflow et DBA Stack Exchange, sans aucune chance.

J'ai eu du mal avec ce problème au cours des deux derniers jours (en travaillant dessus environ 7 heures par jour), et même après avoir recherché le problème sur Google, il semble que personne d'autre n'ait la même variante exacte de mon problème.

Qu'est-ce que j'essaye de faire?

Dans SSIS, j'essaie de lire à partir d'un fichier CSV et d'insérer les lignes de celui-ci dans une base de données OLE DB. Pour cela, j'ai effectué la configuration la plus simple jamais vue ci-dessous.

  1. Flat File Source - lit les lignes CSV.
  2. Derived Column - ne fait actuellement rien (il est juste là pour expérimenter).
  3. Data Conversion - ne fait actuellement rien (il est juste là pour expérimenter).
  4. OLE DB Destination - stocke les lignes dans la base de données.

Lorsque j'essaie de l'exécuter, il cesse de s'exécuter à ma destination OLE DB avec le message d'erreur suivant.

Une erreur s'est produite avec la colonne d'entrée "Montant" (187) sur l'entrée "Entrée de destination OLE DB" (51). Le statut de la colonne renvoyée était: "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".

La colonne qui échoue (Amount) est actuellement de type DT_STR. Il semble que ce soit le type auquel j'ai le plus confiance en ce moment.

Qu'est-ce que j'ai essayé?

  • J'ai essayé d'utiliser la fonction "Suggérer des types" de Flat File Connection Sur la colonne qui échoue. Cela lui a fait recommander le type de données Single byte signed int.
    • Arrête à ma Source du fichier plat .
    • L'erreur est La conversion des données a échoué. La conversion de données pour la colonne "Montant" a renvoyé la valeur d'état 2 et le texte d'état "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".
  • J'ai essayé d'utiliser le Derived Column Pour convertir la colonne en un DT_I4.
    • Arrête à my Colonne dérivée .
    • L'erreur est La conversion des données a échoué. La conversion de données pour la colonne "Montant" a renvoyé la valeur d'état 2 et le texte d'état "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".
  • J'ai essayé d'utiliser le Data Conversion Pour convertir la valeur de ma colonne en un DT_I4.
    • Arrête à mon Data Conversion.
    • L'erreur est La conversion des données a échoué. La conversion de données pour la colonne "Montant" a renvoyé la valeur d'état 2 et le texte d'état "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".
  • J'ai essayé de modifier la longueur de ma valeur DT_STR Dans la source et la destination.
    • Arrête à la source ou la destination en fonction des paramètres.
  • J'ai essayé de me connecter à l'aide d'un connecteur Excel Source à la place avec et sans le IMEX=1 Ajouté à la chaîne de connexion. Pas de chance.

Mon sens de la programmation me dit que je suis foutu. Je n'ai jamais jamais rencontré un si gros problème pour une chose aussi simple.

Et pourquoi est-ce que je ne peux pas simplement ignorer la perte "potentielle" de données? C'est vraiment frustrant de dire le moins.

Mon système

Il s'agit d'une machine Windows Server 2008 R2 avec SQL Server 2008 installé. La machine elle-même est entièrement mise à jour via Windows Update.

J'ai rencontré cela plusieurs fois et le problème était une inadéquation des types de données dans les paramètres d'exportation/importation. La première chose à faire est de vérifier ces paramètres en cliquant avec le bouton droit sur la source ou la destination, en sélectionnant Éditeur avancé. Accédez aux propriétés d'entrée et de sortie et vérifiez le type de données de cette colonne pour tous les éléments - Externe, Sortie et Entrée. J'ai généralement constaté une variance ici, souvent l'un est Unicode (WSTR) et l'autre I4 ou DSTR.

3
Mike

Ignorer l'erreur

Tout d'abord, vous devriez être en mesure d'ignorer la troncature de chaîne en accédant à votre source de fichier plat, sortie d'erreur, puis en changeant "Fail Component" sous "Truncation" en "Ignore Error".

Meilleure solution

Le vrai problème pourrait être que la longueur de chaîne à l'intérieur du pipeline SSIS est toujours incorrecte car elle a été initialisée à un moment antérieur.

Vous pouvez déterminer si c'est le cas en double-cliquant sur la flèche verte de votre source de fichier plat (ou après la conversion de colonne/données dérivée) et en choisissant "Métadonnées". Là, vous pouvez voir la longueur du champ à l'intérieur du pipeline.

Si vous avez souvent vu que les métadonnées ne correspondent plus au composant source, surtout si vous créez la source de fichier plat ET sa connexion correspondante via l'assistant.

Ma suggestion serait de supprimer la connexion et la source de fichier plat et de les recréer car je n'ai pas trouvé de moyen de resynchroniser les métadonnées du pipeline avec les composants source.

8
Oliver Rahner