web-dev-qa-db-fra.com

Importation SSIS Excel forçant un type de colonne incorrect

J'essaie d'importer une feuille de calcul dans notre base de données à l'aide de SSIS. Pour une raison quelconque, SSIS veut croire que deux des colonnes sont de type Double, lorsqu'elles contiennent des données de caractères. J'ai essayé de remapper les colonnes pour qu'elles soient nvarchar (255), mais il ne veut toujours pas sélectionner les données qu'il pense doubles, car il contient des caractères. Si j'essaie de modifier le package SSIS et de modifier les types de colonne dans Excel Source, cela ne me permet pas de changer le type des colonnes dans la sortie d'erreur et me donne une erreur si les colonnes de sortie standard et d'erreur ne rencontre.

Pourquoi SSIS insiste-t-il sur le fait que ces colonnes sont doubles? Comment puis-je le forcer à réaliser que ce sont des chaînes? Pourquoi tout ce qui vient de Microsoft ne doit-il pas fonctionner correctement?

EDIT: J'ai trouvé ceci: http://support.Microsoft.com/kb/236605

J'ai trié mes données de manière à ce que les types de données mélangés soient en haut, et devinez quoi: Le problème inversé. Au lieu de ne pas importer de données de caractères, il a cessé d'importer des données uniquement numériques. Apparemment, quelqu'un ne pense pas que 12345 peut être représenté comme une chaîne ...

45
CodeRedick

J'ai déjà vu ce problème auparavant, c'est Excel qui est le problème, pas SSIS. Excel échantillonne les premières lignes et déduit ensuite le type de données même si vous le définissez explicitement en texte. Ce que vous devez faire est de placer cela dans la chaîne de connexion de fichier Excel du package SSIS. Cette instruction indique à Excel que les colonnes contiennent des types de données mélangés et lui suggère de procéder à une vérification supplémentaire avant de décider que la colonne est un type numérique, alors qu'en fait ce n'est pas le cas.

;Extended Properties="IMEX=1"

Cela devrait fonctionner avec cela (dans la plupart des cas). Le plus sûr est d’exporter les données Excel au format texte délimité par des tabulations et d’utiliser SSIS pour les importer.

41
James

Vous pouvez convertir (c.-à-d. Forcer) les données de colonne en texte ... Essayez ceci (Remarque: ces instructions sont basées sur Excel 2007).

Les étapes suivantes doivent obliger Excel à traiter la colonne en tant que texte:

Ouvrez votre feuille de calcul avec Excel.

Sélectionnez la colonne entière contenant vos "données principalement numériques" en cliquant sur l'en-tête de la colonne.

Cliquez sur l'onglet Données du menu du ruban.

Sélectionnez Texte en colonnes. Cela fera apparaître l'Assistant Convertir le texte en colonnes.

-À l'étape 1: cliquez sur Suivant

-Sur l'étape 2: Cliquez sur Suivant

-À l'étape 3: sélectionnez le texte et cliquez sur Terminer

Enregistrez votre feuille Excel.

Réessayez l'importation à l'aide de l'Assistant Importation de données SQL Server 2005.

Aussi, voici un lien vers une autre question qui a des réponses supplémentaires:

L'importation de données Wizard ne correspond pas au type de données I choisi pour une colonne

30
Joe L.

Une chose qui n’est pas mentionnée dans la réponse acceptée est que le paramètre "IMEX = 1" doit figurer dans inside la partie citée de:

...;Extended Properties="...";
13
RolandTumble

; IMEX = 1; ne fonctionne pas toujours ... Tout sur les types de données mélangés dans Excel: Types de données mélangés dans la colonne Excel

enter image description here

7
Joost

Une autre solution consiste à trier la feuille de calcul avec les données de caractère en haut, ce qui permet à Excel de voir la colonne sous forme de chaîne et de tout importer en tant que tel.

5
marks.chimp

Vous pouvez également modifier le registre pour examiner davantage de valeurs que les 8 premières lignes ..__ J'ai utilisé cette méthode et fonctionne assez bien.

http://support.Microsoft.com/kb/281517

3
Jeremy C

Je frappais ma tête contre un mur avec ce problème pendant un moment. Dans notre environnement, nous consommons les fichiers de prix auprès de nos fournisseurs sous différents formats, dont certains ont plus d’un million d’enregistrements. Ce problème se produit généralement dans les cas suivants:

  • Les lignes analysées par le pilote OLEDB semblent contenir des nombres, mais contiennent des valeurs mixtes ultérieurement dans le jeu d'enregistrements, ou
  • Les champs ne contiennent que des nombres, mais la source en a certains formatés (généralement des fichiers Excel).

Le problème est que, même si vous définissez votre colonne d'entrée externe sur le type de données souhaité, le fichier est analysé à chaque fois que vous exécutez le package et est modifié de manière dynamique en fonction de ce que le pilote OLEDB pense que le champ doit être.

Nos fichiers source contiennent généralement des en-têtes de champ (texte) et des prix (champs numériques), ce qui me donne une solution simple:

Premier pas:

  • Modifiez votre instruction SQL pour inclure les champs d'en-tête. Cela oblige SSIS à voir tous les champs sous forme de texte, y compris les champs de prix.

Pour les champs mixtes:

  • Votre problème initial est résolu car vos champs sont maintenant du texte, mais vous avez toujours une ligne d'en-tête dans votre sortie.
  • Empêchez la ligne d'en-tête de figurer dans votre sortie en modifiant la clause SQL WHERE pour exclure les valeurs d'en-tête, par exemple. "WHERE NOT ([F4] = 'Price')"

Pour les champs numériques:

  • A l'aide de l'éditeur avancé pour la source de base de données OLE, définissez la colonne de sortie Pour le champ de prix (ou tout autre champ numérique) sur un numérique DataType. Cela entraîne l'échec de tous les enregistrements contenant du texte dans ces champs, y compris l'enregistrement d'en-tête, mais force une conversion sur les valeurs numériques .__ enregistrées en tant que texte.

  • Définissez la sortie d'erreur pour ignorer les erreurs sur vos champs numériques.

  • Sinon, si vous avez encore besoin d’erreurs sur les champs numériques redirigés, supprimez la ligne d’en-tête en modifiant la clause SQL WHERE pour exclure les valeurs d’en-tête puis,

  • Définissez la sortie d'erreur pour rediriger les échecs sur ce champ.

Évidemment, cette méthode ne fonctionne que si vous avez des champs d’en-tête, mais heureusement, cela aidera certains d’entre vous.

1
Ryno

J'ai utilisé la recette suivante:

  1. Importer des données d'Excel vers Access
  2. Importer des données depuis Access vers SQL Server

et cela a fonctionné pour moi ...

1
aldy sefan

Eh bien, IMEX = 1 n'a pas fonctionné pour moi. La suggestion de Reynier Booysen non plus. (Je ne sais pas si cela fait une différence, mais j'utilise SQL Server 2008r2). Vous trouverez une bonne explication de certaines solutions de contournement et expliquant pourquoi IMEX = 1 est limité aux huit premières lignes de chaque feuille de calcul à l'adresse http://social.msdn.Microsoft.com/Forums/en-US/ sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75

J'espère que cela t'aides

1
Alan Merriam

J'ai eu le même problème. Le problème réside dans la tâche Excel Source. Lorsque vous configurez cette tâche pour la première fois, elle se connecte au fichier Excel spécifié (via la connexion Excel) et détermine le type de chaque colonne en fonction de la feuille de calcul en cours. 

Ainsi, si vous configurez la tâche Source Excel, assurez-vous simplement que les colonnes qui doivent contenir du texte ne contiennent que du texte. Cela signifie que la tâche Excel Source supposera toujours que les feuilles de calcul suivantes auront le même format et liront 12345 sous forme de texte car la colonne était du texte lors de la configuration de la tâche.

J'espère que cela a du sens!

0
Reynier Booysen

Il m'a fallu un peu pour comprendre la source de l'erreur dans mon paquet. En fin de compte, j’ai trouvé que les données étaient converties en null (Example: from "06" to "NULL") et j’ai trouvé cela via Aperçu dans la connexion au fichier source (Excel Source> Edit> Connection Manager> Sheet='MySheet'> Preview...). Je me suis excité quand j'ai lu le message de James pour éditer la chaîne de connexion pour avoir des propriétés étendues: ;Extended Properties="IMEX=1". Mais cela n'a pas fonctionné pour moi. 

J'ai pu résoudre l'erreur en modifiant le format de cellule dans la feuille de calcul Excel de «Nombre» à «Texte». Après avoir changé le format, le processus de téléchargement s'est déroulé avec succès! Ma chaîne de connexion ressemble à ceci: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\myServer\d$\Folder1\Folder2\myFile.xlsx;Extended Properties="Excel 12.0 XML;HDR=NO";

Voici quelques captures d'écran qui ont résolu mon message d'erreur.

Erreur: métadonnées d'une connexion de fichier Excel enter image description here

Source d'erreur: format “Général” enter image description here

Source d'erreur modifiée: format “Texte” enter image description here

Erreur corrigée: métadonnées de la connexion au fichier Excel enter image description here

0

J'ai eu le même problème, plusieurs valeurs de type de données dans une seule colonne, le package charge uniquement des valeurs numériques. Reste tout ce qu'il a mis à jour comme nul. 

Solution

Pour résoudre ce problème, le type de données Excel est l’une des solutions. Dans Excel Copiez les données de colonne et collez-les dans un autre fichier. Supprimez cette colonne et insérez une nouvelle colonne en tant que type de données Text et collez les données copiées dans une nouvelle colonne.

Désormais, dans le package ssis delete et recréer les tables source et source Excel, changez le type de colonne data en varchar.

Cela fonctionnera.

0

Cela a fonctionné pour moi. Sélectionnez la colonne problématique dans Excel - mettez en surbrillance la colonne entière. Changez le format en "Texte". Enregistrez le fichier Excel.

Dans votre package SSIS, accédez au volet Flux de données pour votre importation. Double-cliquez sur le nœud Excel Source. Il devrait vous avertir que les types ont changé et vous demander si vous souhaitez les remapper. Cliquez sur Oui L'exécution devrait maintenant fonctionner et intégrer toutes les valeurs.

Remarque: J'utilise Excel 2013 et Visual Studio 2015, mais je suppose que ces instructions fonctionneraient également pour les versions antérieures.

0
jaycer
  1. Cliquez sur Fichier dans le menu du ruban, puis sur Options.
  2. Cliquez sur Avancé, puis sous Lors du calcul de ce classeur, cochez la case Définir la précision telle qu'elle s'affiche, puis cliquez sur OK.

  3. Cliquez sur OK.

  4. Dans la feuille de calcul, sélectionnez les cellules que vous souhaitez formater.

  5. Sous l'onglet Accueil, cliquez sur l'image du bouton Lanceur de boîte de dialogue en regard de Numéro

  6. Dans la zone Catégorie, cliquez sur Nombre.

  7. Dans la zone Nombre de décimales, entrez le nombre de décimales que vous souhaitez afficher.

0

Option 1. Utilisez Visual Basic pour parcourir chaque colonne et formater chaque colonne en tant que texte.

Utilisez le menu Text-to-Columns, ne modifiez pas la suppression et remplacez "Général" par "Texte".

0
Aaron Ireland

Si plusieurs colonnes de la feuille de calcul Excel portent le même nom, ce type d'erreur se produit. Le paquet fonctionnera après avoir défini le nom de la colonne. Parfois, les colonnes masquées sont ignorées lors de la vérification des noms de colonnes.

0
Samarendra Panda