web-dev-qa-db-fra.com

SSIS Excel Data Source - Est-il possible de remplacer les types de données de colonne?

Lorsqu'une source de données Excel est utilisée dans SSIS, les types de données de chaque colonne sont dérivés des données des colonnes. Est-il possible de remplacer ce comportement?

Idéalement, nous souhaiterions que chaque colonne livrée à partir de la source Excel soit un type de données chaîne, afin que la validation des données puisse être effectuée sur les données reçues de la source à une étape ultérieure du flux de données.

Actuellement, l'onglet Erreur de sortie peut être utilisé pour ignorer les échecs de conversion. Les données en question sont alors nulles et le package continue à s'exécuter. Cependant, nous voulons savoir quelles étaient les données d'origine pour qu'un message d'erreur approprié puisse être généré pour cette ligne.

18
Hugh Mullally

Oui, vous pouvez. Il suffit d'aller dans la liste des colonnes de sortie sur la source Excel et de définir le type pour chacune des colonnes. 

Pour accéder à la liste des colonnes d'entrée, cliquez avec le bouton droit de la souris sur la source Excel, sélectionnez "Afficher l'éditeur avancé", cliquez sur l'onglet "Propriétés d'entrée et de sortie".

Une solution potentiellement meilleure consiste à utiliser le composant colonne dérivé dans lequel vous pouvez réellement créer de "nouvelles" colonnes pour chaque colonne dans Excel. Cela a les avantages de 

  1. Vous avez plus de contrôle sur ce que vous convertissez.
  2. Vous pouvez définir des règles qui contrôlent le changement (par exemple, si null, donnez-moi une chaîne vide, mais s'il y a des données, donnez-moi les données sous forme de chaîne). 
  3. Votre source de données n’est pas directement liée au reste du processus (c’est-à-dire que vous pouvez changer la source et que le seul endroit où vous aurez besoin de travailler est dans la colonne dérivée)
10
Robert MacLean

Selon cet article de blog , le problème est que le pilote SSIS Excel détermine le type de données de chaque colonne en fonction de la lecture des valeurs des 8 premières lignes:

  • Si les 8 premiers enregistrements contiennent un nombre égal de types numériques et de caractères, la priorité est numérique
  • Si la majorité des 8 premiers enregistrements sont numériques, le type de données est alors numérique et toutes les valeurs de caractères sont lues comme NULL.
  • Si la majorité des 8 premiers enregistrements sont de type caractère, le type de données est attribué sous forme de chaîne et toutes les valeurs numériques sont lues comme NULL.

L'article décrit deux choses que vous pouvez faire pour résoudre ce problème:

  1. Tout d’abord, ajoutez IMEX=1 à la fin de la chaîne de connexion de votre pilote Excel. Cela permettra à Excel de lire les valeurs au format Unicode. Toutefois, cela ne suffit pas si les données des 8 premières lignes sont numériques.
  2. Dans le registre, définissez la valeur de HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows sur 0. Cela garantit que le pilote examine toutes les lignes pour déterminer le type de données de la colonne.
9
Ryan Kohn

Si votre fichier Excel contient un numéro dans la colonne en question dans la première ligne de données, il semble que le moteur SSIS réinitialise le type sur un type numérique. Il n'arrêtait pas de réinitialiser le mien. Je suis allé dans mon fichier Excel et ai changé les numéros en "Nombres stockés sous forme de texte" en plaçant un guillemet simple devant eux. Ils sont maintenant lus sous forme de texte.

J'ai aussi remarqué que SSIS utilise la première ligne pour IGNORER ce que le programmeur a indiqué comme étant le type réel des données (j'ai même dit à Excel de formater la colonne entière en tant que TEXT, mais SSIS utilisait toujours les données, qui étaient un tas de chiffres) et le réinitialiser. Une fois que j'ai résolu ce problème en plaçant une seule citation dans mon fichier Excel devant le numéro de la première ligne de données, je pensais que tout irait bien, mais non, il y a du travail supplémentaire.

En fait, même si la colonne source de données externe SSIS a maintenant le type DT_WSTR, 43567192 sera toujours libellé comme suit: 4.35671E + 007. Vous devez donc retourner dans votre fichier Excel et mettre des guillemets simples devant tous les chiffres.

Jolie LAME, Microsoft! Mais voici votre solution. Je ne sais pas quoi faire si le fichier Excel n'est pas sous votre contrôle.

7
Dave Scotese

Je cherchais une solution au problème similaire, mais je n'ai rien trouvé sur Internet. Bien que la plupart des solutions trouvées fonctionnent au moment de la conception, elles ne fonctionnent pas lorsque vous souhaitez automatiser votre package SSIS.

J'ai résolu le problème et l'ai fait fonctionner en modifiant les propriétés de "Source Excel". Par défaut, la propriété AccessMode est définie sur OpenRowSet. Si vous le changez en SQL Command, vous pouvez écrire votre propre code SQL pour convertir les colonnes à votre guise. 

Pour moi, SSIS traitait la colonne NDCCode comme float, mais j'en avais besoin comme d'une chaîne. J'ai donc utilisé le code SQL suivant:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]

 enter image description here

 enter image description here

2
Alok B

La source Excel est SSIS se comporte de manière folle. SSIS détermine le type de données dans une colonne particualr en lisant les 10 premières lignes. Si vous avez une colonne de texte avec des valeurs NULL dans les 10 premières étapes, SSIS prend le type de données sous la forme Int. Avec un peu de lutte, voici une solution de contournement

  1. Insérez une ligne factice (de préférence la première ligne) dans la feuille de calcul. Je préfère effectuer cette opération via une tâche de script. Vous pouvez envisager d'utiliser un service pour prétraiter le fichier avant que SSIS ne s'y connecte.

  2. Avec la ligne duummy, vous êtes sûr que les types de données seront définis selon vos besoins

  3. Lisez les données à l'aide de la source Excel et filtrez la ligne factice avant de la reprendre pour un traitement ultérieur.

Je sais que c'est un peu minable, mais ça marche :)

2
user3366772

Je pourrais résoudre ce problème. lors de la création du package SSIS, j'ai modifié manuellement la colonne spécifique en texte (ouvrez le fichier Excel, sélectionnez la colonne, cliquez avec le bouton droit de la souris sur la colonne, sélectionnez les cellules de format, sélectionnez l'onglet Texte et enregistrez Excel). Créez maintenant le package SSIS et testez-le. Ça marche. Essayez maintenant d'utiliser le fichier Excel où cette colonne n'a pas été définie en tant que texte. 

Cela a fonctionné pour moi et j'ai pu exécuter le paquet avec succès. 

0
user3397876