web-dev-qa-db-fra.com

Erreur lors de la conversion des types de données lors de l'importation d'Excel vers SQL Server 2008

Chaque fois que j'essaie d'importer un fichier Excel dans SQL Server, j'obtiens une erreur particulière. Lorsque j'essaie de modifier les mappages, la valeur par défaut pour tous les champs numériques est float. Aucun des champs de mon tableau ne contient de décimales et ne constitue pas un type de données monétaire. Ce ne sont que des nombres à 8 chiffres. Cependant, comme je ne veux pas que ma clé primaire soit stockée sous la forme d'un float lorsqu'il s'agit d'un int, comment puis-je résoudre ce problème? Cela me donne une erreur de troncature, je posterai un bouchon d'écran si nécessaire. Est-ce un problème courant?

Il est à noter que je ne peux pas importer de fichiers Excel 2007 (je pense avoir trouvé la solution à ce problème), mais même lorsque j'essaie d'importer des fichiers .xls, chaque valeur contenant des chiffres est automatiquement importée sous forme de virgule flottante. changez-le je reçois une erreur.

http://imgur.com/4204g

8
wootscootinboogie

SSIS ne convertit pas implicitement les types de données, vous devez donc le faire explicitement. Le gestionnaire de connexions Excel ne peut gérer que quelques types de données et tente de deviner la meilleure hypothèse en fonction des premières lignes du fichier. Ceci est entièrement documenté dans la documentation SSIS.

Vous avez plusieurs options:

  • Changez votre type de données de destination en float
  • Chargement dans une table 'intermédiaire' avec un type de données float à l'aide de l'importation Wizard puis de INSERT dans la table de destination réelle à l'aide de CAST ou CONVERT pour convertir les données
  • Créez un package SSIS et utilisez la transformation Data Conversion pour convertir les données.

Vous voudrez peut-être aussi noter les commentaires dans la documentation Importer Wizard à propos des mappages de types de données.

9
Pondlife

Ce que Derloopkat a dit, ce qui peut toujours échouer lors de la conversion (pas d'infraction Derloopkat), car Excel est terrible en cela

  1. Collez d'Excel dans le Bloc-notes et enregistrez-le normalement (fichier .txt).
  2. Depuis Excel, ouvrez le fichier .txt.
  3. Sélectionnez ensuite car il est évidemment délimité par des tabulations.
  4. Sélectionnez "aucun" pour le qualificateur de texte, puis à nouveau.
  5. Sélectionnez la première ligne, maintenez la touche Maj enfoncée, sélectionnez la dernière ligne et sélectionnez le bouton de texte radial. Cliquez sur Terminer

Il s’ouvrira, vérifiez-le pour vous assurer de son exactitude, puis enregistrez-le sous un fichier Excel.

7
JackArbiter

Lorsque Excel trouve des types de données mélangés dans la même colonne, il détermine le format approprié pour la colonne (la majorité des valeurs détermine le type de la colonne) et ignore toutes les autres valeurs en insérant des valeurs NULL. Mais Excel le fait beaucoup mal (par exemple, si une colonne est considérée comme du texte et que Excel trouve un nombre, décide ensuite que ce nombre est une erreur et insère un NULL à la place. dans une colonne entière de la base de données).

Solution:

  1. Créer une nouvelle feuille Excel avec le nom des colonnes dans la première ligne
  2. Formater les colonnes en texte
  3. Collez les lignes sans format (utilisez le format CVS ou copiez/collez dans le Bloc-notes pour obtenir uniquement du texte)

Notez que le formatage des colonnes sur une feuille Excel existante n'est pas suffisant.

4
derloopkat

Il y a une solution de contournement.

  1. Importer une feuille Excel avec des nombres en virgule flottante (par défaut).
  2. Après avoir importé, Goto Table-Design
  3. Modifier le type de données de la colonne de Float à Int ou Bigint
  4. Sauvegarder les modifications
  5. Modifier le type de données de la colonne de Bigint en un type de texte quelconque (Varchar, nvarchar, text, ntext, etc.)
  6. Sauvegarder les modifications.

C'est tout.

2
Shahbaz

Il semble y avoir une solution vraiment facile pour traiter les problèmes de type de données.

Fondamentalement, à la fin de la chaîne de connexion Excel, ajoutez ;IMEX=1;"

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\YOURSERVER\shared\Client Projects\FOLDER\Data\FILE.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=1";

Cela résoudra les problèmes de type de données tels que les colonnes où les valeurs sont mélangées avec du texte et des nombres. 

Pour accéder à la propriété de connexion, cliquez avec le bouton droit de la souris sur le gestionnaire de connexions Excel situé sous le flux de contrôle et cliquez sur les propriétés. Ce sera à droite sous la solution Explorer. J'espère que cela pourra aider.

1
SQLCodingIsFunnn

Une solution de contournement à prendre en compte:

  1. enregistrer une copie du fichier Excel, modifier la colonne pour mettre en forme le type 'texte'
  2. copier les valeurs de colonne et coller dans un éditeur de texte, enregistrer le fichier (appelez-le tmp.txt ).
  3. modifiez les données dans le fichier texte pour qu'il commence et se termine par un caractère afin que le mécanisme d'importation de SQL Server le reconnaisse en tant que texte. Si vous avez un éditeur de fantaisie, utilisez les outils inclus. J'utilise awk dans cygwin sur mon ordinateur portable Windows. Par exemple, je commence fin par la fin de la valeur de colonne avec un guillemet simple, comme " $ awk '{print"\x27 "$ 1"\x27 "}' ./tmp.txt> ./tmp2.txt "
  4. copier et coller les données de tmp2.txt au-dessus de la colonne nécessaire du fichier Excel et enregistrer le fichier Excel
  5. lancez l'importation du serveur SQL pour votre fichier Excel modifié ... assurez-vous de bien vérifier que le type de données choisi par l'importateur n'est pas numérique ... s'il l'est, répétez les étapes ci-dessus avec un jeu de caractères différent

Les données dans la base de données auront les guillemets une fois l'importation terminée ... vous pourrez les mettre à jour ultérieurement pour supprimer les guillemets, ou utiliser la fonction "remplacer" dans votre requête de lecture, telle que " replace ([dbo ]. [MaTable]. [MaColonne], '' '', '') "

0
Jeff Myles