2017-10-03 3 views
0

J'ai un package SSIS dans lequel j'utilise un conteneur ForEach pour faire défiler une destination de dossier et extraire un seul fichier .csv.Tuyauterie de données du fichier CSV vers la destination OLEDB dans SSIS

Figure 1

Le conteneur prend le fichier qu'il trouve et utilise le nom de fichier pour le ConnectionString d'un gestionnaire de connexions de fichiers plats.

Dans le conteneur, j'ai une tâche de flux de données pour déplacer les données de ligne du fichier .csv (en utilisant le gestionnaire de connexion de fichier plat) vers une destination OLEDB (il utilise un autre gestionnaire de connexion OLEDB).

Figure 2

Lorsque je tente d'exécuter ce conteneur, il peut saisir le nom du fichier, le charger dans le gestionnaire de connexions de fichiers plats, et commencer à transférer des données de la ligne; cependant, il cesse d'erreurs avant de passer sur toutes les données - à savoir sur deux questions:

Erreur: 0xC02020A1 à déplacer les données de règlement dans la table Temp, SettlementData_YYYYMM [1143]: Conversion de données a échoué. La conversion de données pour la colonne "" MONTHS_REMAIN "" 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.". Erreur: 0xC02020A1 lors du déplacement de données de fichier de résolution dans la table temporaire, source de fichier plat [665]: échec de la conversion de données. La conversion de données pour la colonne "" CUST_NAME "" a renvoyé la valeur d'état 4 et le texte d'état "Le texte a été tronqué ou un ou plusieurs caractères ne correspondaient pas dans la page de codes cible.". Dans mes recherches jusqu'à maintenant, je sais que vous pouvez définir les conditions pour forcer un échec d'erreur et choisir d'ignorer les échecs de Troncation dans le Gestionnaire de connexions; cependant, étant donné que ConnectionString de Flat File Connection Manager est refait chaque fois que le conteneur s'exécute, il ne semble pas conserver ces paramètres d'option. Il devrait aussi, selon mon expérience, choisir la plus grande valeur de l'ensemble de données lorsque le Gestionnaire de connexions choisira OutputColumnWidth pour chaque colonne, donc je ne comprends pas très bien comment il y a des noms tronqués (le DB est défini comme VARCHAR (255) donc il y a beaucoup de place là-bas). En ce qui concerne les conversions de données échouées, je ne comprends pas non plus comment cela peut se produire lorsque la colonne référencée utilise des valeurs Int simples, et que le gestionnaire de connexion ET la base réceptrice utilisent des flottants qui doivent englober les données Int (est-ce que je ne sais pas que vous ne pouvez pas convertir Int en Float?).

D'après mon expérience, certains fichiers .csv ne sont pas très lisibles dans SSIS lorsqu'ils sont directement dans une destination DB; donc, serait-il préférable de transformer le .csv en un fichier .xlsx, qui joue beaucoup mieux dans une base de données, ou y a-t-il autre chose qui me manque pour déplacer facilement des quantités massives de données d'un fichier .csv dans une base de données? OU, est-ce que je suis juste stupide et transforme un sujet trivial en quelque chose de plus grand que ça? Remarque: La raison pour laquelle je configure dynamiquement le fichier dans le Gestionnaire de connexion de fichier plat est que le fichier .csv aura un nom d'ensemble ajouté au mois/année, il a été produit dans le cadre d'un processus de répétition, et ainsi de suite. J'utilise la partie constante du nom de saisir quelle que soit la date d'info

EDIT: Voici un chapeau d'écran de mon directeur Flat File Connection aperçu de certaines des données qu'il va essayer de tuyau à travers.J'ai remarqué que certaines de ces lignes avaient des guillemets autour d'eux, et je voulais m'assurer que cela n'affecterait pas négativement - la colonne ayant des problèmes est la MONTHS_REMAIN un enter image description here

+1

Même si la connexion sous-jacente change, les paramètres de sortie d'erreur que vous avez définis pour le composant Source de fichier plat doivent être conservés. Rarement les fichiers XLSX facilitent les choses dans SSIS. Le connecteur XLSX souvent [devine le type de données des colonnes Excel faux] (https://www.concentra.co.uk/blog/why-ssis-always-gets-excel-data-types-wrong-and-how-to- répare le). Et les fichiers Excel apportent avec eux la complexité des handles de fichiers. Si quelqu'un d'autre a le fichier Excel ouvert, alors que le paquet essaie de le traiter, alors le paquet échouera. Stick avec des CSV. –

Répondre

1

Est-il possible que l'un des fichiers csv dans la suite vous le traitement est-il mal formé? Par exemple, si l'un des fichiers avait une colonne/virgule supplémentaire, cela pourrait forcer une colonne varchar dans une colonne entière, produisant une erreur similaire à celles que vous avez décrites. Avez-vous essayé d'utiliser la redirection de ligne d'erreur pour confirmer que tous vos fichiers csv sont correctement formés?

Pour utiliser la redirection de ligne d'erreur, mettez à jour votre Flat File Source et réglez les paramètres Error Output pour rediriger les lignes. Votre composant Source de fichier plat aura désormais une flèche rouge supplémentaire que vous pouvez connecter à une destination. Faites glisser la flèche rouge de votre composant source vers une nouvelle division conditionnelle. Ensuite, cliquez avec le bouton droit sur la ligne rouge et ajoutez dataviewer. Maintenant, lorsque les lignes d'erreur sont traitées, elles passent sur la ligne rouge dans la visionneuse de données afin que vous puissiez les examiner. Enfin, exécutez le paquet et attendez que le dataviewer capture les lignes errantes pour examen.

enter image description here

Ne regardez les valeurs de données capturées par le visualiseur de données correctes? Bonne chance!

+0

Donc, comme vous l'avez démontré ici, chaque ligne commet une erreur dans le chemin du visualiseur de données, avec le message "La valeur des données ne peut pas être convertie pour des raisons autres que la non-concordance ou le dépassement de données". La colonne qui semble être problématique contient des nombres entiers négatifs et positifs, et dans mon Gestionnaire de connexion de fichier plat j'ai le DataType défini comme DT_I4, avec la destination OLEDB de réception définie comme un nombre entier. Cela semble-t-il incorrect pour ce type de données? –

+1

Si toutes les erreurs de ligne alors nous avons un problème fondamental. Il semble que le type de données des colonnes de la connexion SettlementData_YYYYMM soit mal défini. De votre image, la colonne '" MONTHS_REMAIN "' contient des valeurs de '-54.00' et' '194" '. '" 194 "' n'est pas un type de données DT_I4. Ce sont des colonnes DT_WSTR. Copiez votre gestionnaire de connexions existant et redéfinissez toutes les colonnes dans les colonnes DT_WSTR, puis réessayez. Une fois que la source fonctionne sans erreurs, travaillez sur la conversion de ces colonnes de DT_WSTR en DT_I4. Ajouter un composant de colonne dérivé à remplacer par des guillemets doubles et convertir –

+1

Exemple de code de transformation de colonne dérivée pour supprimer les guillemets et convertir en DT_I4. '(DT_I4) REPLACE ([MyColumn]," \ "", "") '.Vous devrez faire ceci sur toutes les colonnes –