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 :

Exporter un fichier CSV avec SQLCMD ou BCP en remplissant les colonnes du fichier Excel [2008R2]


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut Exporter un fichier CSV avec SQLCMD ou BCP en remplissant les colonnes du fichier Excel
    Bonjour à tous,

    Voilà je suis débutant et je dois exporter, à partir SQL SERVER management studio, le résultat d'une requête en générant un fichier Excel, j'utilise soit BCP soit SQLCMD comme ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec xp_cmdshell 'sqlcmd -S localhost -d NomDeMaBase -E -Q "SELECT * FROM NomDeMaTable" -o "c:\MonTest.csv" -W -w 1024 -s"|"'
    Cela est censé séparer les colonnes dans Excel

    Mon problème c'est que tout le résultat est mis dans la première colonne et à l'intérieur de cette colonne effectivement les colonnes sont séparés par le caractère que j'ai renseigné (ici "|"). Mais je veux que chaque colonne aille dans une colonne différente.
    Je commence à me dire que ce n'est peut être pas possible avec BCP ni avec SQLCMD

    quelqu'un aurait-il la réponse ?

    merci par avance de m'avoir lu

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Un fichier csv est un fichier de données séparées par un séparateur.

    Dans Excel, ou sur ton poste dans "Options régionales", tu peux paramétrer ce séparateur qui est par défaut ";" (ou ","). (Données => Convertir).
    Donc dans ton Excel, paramètre que tu veux que le séparateur soit "|" et ça devrait le faire ;-)

    Si tu exportes avec le séparateur par défaut de ta machine, tu n'auras pas ce soucis... Change
    -s"|"
    en
    -s";"
    dans la commande.

    A+

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut
    Merci beaucoup Tidus159 !!!

    Oui en fait je viens de m'en apercevoir !

    Par contre par hasard saurais-tu comment éviter d'avoir, à la deuxième ligne (c'est à dire entre les entête de colonne et les résultats) une ligne de "-----------------" ? Et d'éviter aussi l'info à la fin qui indique le nombre de lignes affectées ?

    Je cherche à avoir les données "pures"

  4. #4
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Si tu regardes la documentation (ou simplement un coup de google ;-)), tu vois que pour supprimer les headers il faut ajouter l'option
    -h -1
    ,
    pour ne pas avoir les "rows affected" tu peux ajouter avant ton select dans ta commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set nocount on; SELECT ...
    A+

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut
    Oui pour le -h-1 je connais mais je ne veux pas supprimer les headers, juste supprimer la ligne "--------------" qui est juste en desous, je crois que je vais être obliger de faire une fonction qui récupère les headers et les enregistre dans un csv puis de récupérer les données et ensuite de les concaténer

    par contre merci beaucoup pour le tu es au top !

  6. #6
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Je crois aussi.
    Sinon lors de l'utilisation de ton fichier .csv tu peux définir que la ligne 2 ne sera pas utilisée. Ça ne me semble pas dégueu.
    Sinon tu fais un package avec 2 fichiers csv : 1 fichier d'entête et 1 fichier de "données pures".
    Ou encore, à la place d'avoir un script de commande d'une ligne, tu peux certainement faire ça en script (powershell ?) qui te fait la concaténation en un seul fichier et que tu pourras rebalancer (mais mes compétences s'arrêtent là) !

    A+

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut
    Je suis parvenue au résultat voulue

    j'ai crée une fonction sql qui me retourne les entête de colonne concaténée :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CREATE FUNCTION retourne_entete (@nom_table varchar(20))
    RETURNS VARCHAR(8000) 
     
    AS
    BEGIN
     
    DECLARE	@name varchar(20),
    @entete varchar(8000)
    DECLARE MonCurseur CURSOR 
    FOR 
    SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @nom_table 
    OPEN MonCurseur
     
    FETCH MonCurseur INTO @name
    WHILE @@fetch_Status = 0
    BEGIN
     
    IF @entete IS NOT NULL
    SET @entete=@entete+';'+@name
    ELSE SET @entete=@name
     
    FETCH MonCurseur INTO @name
    END
     
    CLOSE MonCurseur
    DEALLOCATE MonCurseur
     
    RETURN @entete
    END
    Ensuite je peux lancer les lignes suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec xp_cmdshell 'bcp " SELECT MaBase.sys.retourne_entete(''NomDeMaTable'')" queryout "c:\test.csv" -c -t; -r \n -T'
    exec xp_cmdshell 'bcp "select *  from MaBase.sys.NomDeMaTable" queryout "c:\test_tmp.csv" -c -t; -r \n -T'
    exec xp_cmdshell 'type "c:\test_tmp.csv" >> "c:\test.csv"'
    exec xp_cmdshell 'del "c:\test_tmp.csv"'
    En gros je récupère les entête que je génère en csv, puis je génère les données pure, ensuite je fusionne les deux fichiers csv
    et enfin je supprime le fichier csv temporaire.

    C'est de la gymnastique mais ça marche !

    Je te remercie sincèrement de ton aide et de l’intérêt que tu porté à mon problème !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 27
    Dernier message: 21/04/2014, 15h05
  2. [AC-2003] Export d'un fichier en CSV avec la date du jour dans le nom du fichier
    Par thomasmbai dans le forum VBA Access
    Réponses: 3
    Dernier message: 19/01/2012, 04h16
  3. [EG] Exporter un fichier CSV avec un nom dynamique
    Par xav2229 dans le forum Outils BI
    Réponses: 0
    Dernier message: 04/01/2012, 15h33
  4. Update fichier CSV avec ADO et Windev
    Par bastiencb dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 13/12/2006, 16h27
  5. [CSV] Affichage d'un fichier csv avec pagination
    Par arnoweb dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2006, 15h13

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