IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Import csv via bulk insert


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut Import csv via bulk insert
    Bonjour,
    Je souhaite réaliser un import de données via la commande bulk insert (Pas de SSIS). Cependant, ne connaissant pas à l'avance le nombre de colonnes (Je n'utilise qu'une partie des colonnes), il serait nécessaire que l'import créer une table dynamiquement et là je ne vois pas comment réaliser cela.

    Merci par avance pour votre aide
    Cordialement,
    Daniel

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Bonjour,
    peut-être que dans ce cas, un server lié serait plus pratique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    EXEC sp_addlinkedserver 
    @server ='ExcelSource',
    @srvproduct ='Excel',
    @provider ='Microsoft.Jet.OLEDB.4.0',
    @datasrc = 'c:\MonFichier.xls',
    @provstr ='Excel 8.0';
     
    EXEC sp_addlinkedsrvlogin 
    @rmtsrvname ='ExcelSource',
    @useself = false,
    @locallogin =NULL,
    @rmtuser ='ADMIN',
    @rmtpassword =NULL;
     
    select * from ExcelSource...Feuil1$
    (le fichier c:\MonFichier.xls étant sur le server of course)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Le problème de cette méthode est qu'il est nécessaire de déclarer le serveur lié ou j'ai rien compris....

    Puisqu'en utilisant la méthode indiqué plus haut, j'ai le message suivant qui est affiché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*7202, Niveau*11, État*2, Ligne*15
    Impossible de trouver le serveur 'ExcelSource' dans sysservers. Vérifiez que le nom du serveur correct a été spécifié. Si nécessaire, exécutez la procédure stockée sp_addlinkedserver pour ajouter ce serveur à sysservers.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Que donne ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    EXEC sp_addlinkedserver 
    @server ='ExcelSource',
    @srvproduct ='Excel',
    @provider ='Microsoft.Jet.OLEDB.4.0',
    @datasrc = 'c:\MonFichier.xls',
    @provstr ='Excel 8.0';

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Cela fonctionne mais comment stocker le contenu dans une table?
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * INTO TEMP FROM ExcelSource...FEUILLE1$;
    Mais il m'indique une erreur

    Par contre, une question complémentaire:
    Est-ce que le lien est stockée définitivement?
    Est-ce que lors d'un appel ultérieure, je dois recréer le lien?
    Puis-je détruire un lien?

    Y a beaucoup de question mais on y arrive.

    Au passage, je tiens à te remercier

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Mais il m'indique une erreur
    Quelle est-elle ?

    FEUILLE1$ est-il le nom d'une zone de données dans votre fichier Excel ?

    Est-ce que le lien est stockée définitivement?
    Oui, jusqu'à ce que vous le supprimiez

    Est-ce que lors d'un appel ultérieure, je dois recréer le lien?
    Non

    Puis-je détruire un lien?
    Bien sûr, avec la procédure stockée système sp_dropserver

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par elsuket Voir le message

    FEUILLE1$ est-il le nom d'une zone de données dans votre fichier Excel ?
    Je ne comprends pas la question, cependant le nom de la feuille est ok

    L'erreur qui s'affiche est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg*7399, Niveau*16, État*1, Ligne*1
    Le fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "ExcelSource" a rapporté une erreur. Le fournisseur n'a donné aucune information quant à cette erreur.
    Msg*7303, Niveau*16, État*1, Ligne*1
    Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "ExcelSource".

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Je me pose une question:
    Pourquoi ne puis-je utiliser cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * INTO #TEMP FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
    			'Data Source=D:\FILE.csv;Extended Properties=Excel 8.0')...[Lam$]
    Le message d'erreur suivant s'affiche;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg*7399, Niveau*16, État*1, Ligne*1
    Le fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)" a rapporté une erreur. Le fournisseur n'a donné aucune information quant à cette erreur.
    Msg*7303, Niveau*16, État*1, Ligne*1
    Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)".

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Cela provient probablement de votre fichier, qui est un CSV, pas un fichier Excel au sens strict du terme : ouvrez un fichier CSV avec le bloc note pour voir

    Pour importter un fichier CSV, utilisez la commande BULK INSERT, comme vous le disiez dans votre premier post.

    @++

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Cela provient probablement de votre fichier, qui est un CSV, pas un fichier Excel au sens strict du terme : ouvrez un fichier CSV avec le bloc note pour voir

    Pour importter un fichier CSV, utilisez la commande BULK INSERT, comme vous le disiez dans votre premier post.

    @++
    Je suis désolé d'insister mais il ne semble pas être possible d'insérer dans une table temporaire qui sera crée lors de la récupération des données

  11. #11
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Dans ce cas créez une table d'import.
    Si vous devez faire des imports réguliers, elle vous servira.
    Si c'est ponctuel, supprimez-la.

    Rappellez-vous que lorsque vous créez une table temporaire, comme toute table, celle-ci est créée dans la base de données système TempDB.
    Elle est ensuite supprimée en fin de session si c'est une table temporaire locale (#) ou par commande (DROP TABLE ##maTable) si celle-ci est globale.

    @++

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Dans ce cas créez une table d'import.
    Si vous devez faire des imports réguliers, elle vous servira.
    Si c'est ponctuel, supprimez-la.

    Rappellez-vous que lorsque vous créez une table temporaire, comme toute tabel, celle-ci et créée dans la base de données système TempDB. Elle est ensuite supprimée en fin de session si c'est une table temporaire locale (#) ou par commande (DROP TABLE ##maTalbe) si celle-ci est gloabale.

    @++
    Je pense mettre mal exprimé mais je ne vois pas comment la fonction bulk insert peut créer une table en se basant directement sur un fichier. Le problème étant que je ne peux pas la créer en amont car je ne connais pas le contenu

  13. #13
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Excusez-moi, c'est moi qui vous ai répondu complètement à côté de la plaque.

    J'ai cherché avec ces commandes :

    - BULK INSERT,
    - OPENROWSET (BULK ...),
    - Utilitaire BCP

    Mais je n'ai pas trouvé comment vous solutionner ...

    La seule méthode que j'aie trouvé est assez barbare :

    - créer une table d'import avec un nombre de colonnes que vous êtes sûr de ne jamais atteindre,
    - réaliser l'import, avec la commande BULK INSERT,
    - rechercher les colonnes qui ne contiennent pas de valeurs,
    - finaliser l'import dans la table cible

    Si je trouve mieux je vous tiens au courant

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    Merci pour ces réponses, je continus de chercher de mon côté

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Désolé j'ai un peu perdu tout ca de vue.
    En tout cas il me semblait que les serveurs liés marchaient avec CSV.
    Je pense que le problème est le même qu'ici :
    Citation Envoyé par DanaX Voir le message
    Je me pose une question:
    Pourquoi ne puis-je utiliser cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * INTO #TEMP FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
    			'Data Source=D:\FILE.csv;Extended Properties=Excel 8.0')...[Lam$]
    Le message d'erreur suivant s'affiche;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg*7399, Niveau*16, État*1, Ligne*1
    Le fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)" a rapporté une erreur. Le fournisseur n'a donné aucune information quant à cette erreur.
    Msg*7303, Niveau*16, État*1, Ligne*1
    Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "Microsoft.Jet.OLEDB.4.0" du serveur lié "(null)".
    C'est parfois un problème de droits. Pour créer un serveur lié, openrowset, opendatasource, un DSN temporaire doit être créé dans le repertoire temp. Or si le user connecté à SQL n'a pas les droits en écriture sur ce répertoire, ca pose problème.
    Voir ici pour les solutions possibles et explications détaillées.

Discussions similaires

  1. [MySQL] Import fichier CSV via l'interface MySQL
    Par RENAUDER dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 09/02/2009, 16h19
  2. importation CSV via Wlanguage
    Par chapeau_melon dans le forum WinDev
    Réponses: 3
    Dernier message: 13/01/2009, 07h36
  3. Insertion en bloc via BULK INSERT avec c# (2.0)
    Par killysui dans le forum C#
    Réponses: 5
    Dernier message: 19/12/2008, 14h49
  4. [BULK INSERT] import de certaines colonnes uniquement
    Par _Eric_ dans le forum Développement
    Réponses: 1
    Dernier message: 12/10/2008, 00h55
  5. Importation de CSV via ODBC dans Access
    Par inc002 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/03/2008, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo