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

Outils SQL Server Discussion :

[SQL Server] bcp out : comment récupérer la ligne d'en-tete ?


Sujet :

Outils SQL Server

  1. #1
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 31
    Points
    31
    Par défaut [SQL Server] bcp out : comment récupérer la ligne d'en-tete ?
    Bonjour,
    J'ai un problème avec bcp :
    mon fichier d'exportation de la base doit avoir une première ligne d'entete avec les noms des variables de la table : est-ce possible de récupérer ces noms (à partir du format ou à partir de la table directement)?

    si je ne peux pas, y'a-t'il au moins possibilité que j'écrive 2 fois dans un meme fichier sans l'écraser :
    -une première fois ou j'écrirais le nom des variables avec une bete requete print ou alors en cherchant dans les métatables, les noms de variables de la table
    -une deuxieme fois avec le bcp out, où j'exporterais le contenu de la table

    Si quelqu'un a la solution je suis preneuse.
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Bonjour,

    Vous n'avez pas vraiment besoin de le faire.
    Utilise simplement une formulation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select 'MonChamp1','MonChamp2','MonChamp3'
    UNION ALL
    Select MonChamp1,MonChamp2,MonChamp3
    FROM MaTable

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 31
    Points
    31
    Par défaut Ce n'est pas possible pour les int
    Merci mais,
    Ce serait ok si je n'avais que des types chaines de caractères.
    l'union de fonctionne pas si les types diffèrent.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par rastoix
    Merci mais,
    Ce serait ok si je n'avais que des types chaines de caractères.
    l'union de fonctionne pas si les types diffèrent.
    ben tu convertis

    en plus, tu n'as pas précisé :
    1- si tu avais fait un fichier format.
    2- si tu vas imposer une norme d'extraction des donnes numerique (paddée avec des 0 à droite ou à gauche), idem norme date, idem norme Chaines de caractères (padées à gauche ou droite avec des espaces)...

    Bref si tu as besoin de ce formattage avant extraction, tu vas devoir tout convertir en chaine de caractère. Donc l' UNION sera parfait

  5. #5
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 31
    Points
    31
    Par défaut Précisions
    J'utilise un fichier de format pour ma commande bcp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bcp mabase..matable out c:\fichier_export.csv -f c:\format_exportation.fmt -T -e c:\erreur_exportation.txt
    J'ai des données numériques, des chaines....(plusieurs centaines de variables), pas de conditions particulières sur les int.

    Pas la peine de faire : : Je sais bien que je peux changer les types de données : le tout est de savoir s'il existe de quelques chose de moins couteux en temps (car changer les types de donnés sur des centaines de variables pour ma grosse table, ça a un coût qui n'est pas anodin)

    cette exportation aura lieu toutes les nuits.

    Si jamais il existe quelque chose qui le fasse directement, ça m'arrangerait : évidemment s'il n'y a pas d'autres solutions, je passerais par un changement général de type.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    ok ok.

    Dans ce cas là une solution plus crade mais qui marche parfaitement et surtout évite tout pb de conversion de champ d'une table avec des centaines de colonnes

    Tu fais une procédure stockée qui fait :

    1- Appel la commande BCP QUERYOUT avec comme requete le select de tes noms de colonnes. Extraction dans le fichier cible fichier_export.csv

    2- Appel la commande BCP QUERYOUT avec comme requete le select des données de ta table. Extraction dans un fichier donnees.csv par exemple

    3- Creation et execution via xp_cmshell de la commande DOS 'type donnees.csv >> fichier_export.csv'. Cele concatène les deux fichiers en 1

    Inconvénient (y'en a plusieurs mais celui-là est le majeur) : tu dois compter deux fois l'espace disque car tu as 2 fichiers DOS de la quasi même taille pour une seule extraction de données

    A noter que si la table ne change pas beaucoup, alors tu peux extraire les noms de colonnes dans un fichier entete.txt une fois pour toute et faire deux concaténations DOS, ce qui évite de refaire une extraction des noms de colonnes si ceux-ci ne changent jamais.

  7. #7
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 18
    Points : 31
    Points
    31
    Par défaut Super
    Super,
    J'avais pas pensé aux commandes dos (idiote que je suis ) et comme j'utilise un .bat ce que tu m'indique marche nickel !!!
    Donc finalement voici comment je procède :
    1) création d'une fonction stockée qui me renvoie les noms des variables séparées par un séparateur ';' et qui ne met pas ';' après la dernière variable:
    (j'ai mis en paramètre le nom de la table)

    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
    31
    32
     
     
    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 name from [mabase].[sys].[all_columns]
    where object_id = (select object_id from [mabase].[sys].[tables] where 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

    2) dans mon fichier .bat
    Je fais les 2 bcp
    J'utilise la commande type pour concaténer les 2 fichiers crées
    J'efface le fichier temporaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SET REP=C:\.....(chemin)
     
    bcp "SELECT mabase.dbo.retourne_entete('Exportation')" queryout %REP%\Exportation.csv -T -c 
    bcp mabase..Exportation out %REP%\Exportation_tmp.csv -f %REP%\Exportation.fmt -T -e %REP%\Exportation_erreur.txt -E 
    type %REP%\Exportation_tmp.csv >> %REP%\Exportation.csv
    del %REP%\Exportation_tmp.csv
    Ca marche, je suis trop contente.
    MERCI MERCI MERCI

  8. #8
    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
    Bonjour rastoix !

    Je sais que je déterre ce poste qui date d'il y a... 9 ans

    mais je voulais savoir je souhaite créer la function mais quand tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select name from [mabase].[sys].[all_columns]
    le [all_columns] c'est quoi ? j'ai du mal à saisir

    Si à tout hasard tu tombais sur mon message ce serais super sympa de m'éclairer

    Merci à toi si tu m'as lu :-)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par RSS13 Voir le message
    le [all_columns] c'est quoi ? j'ai du mal à saisir
    vue système : http://msdn.microsoft.com/en-us/library/ms177522.aspx

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

Discussions similaires

  1. [SQL Server] bcp out : comment récupérer la ligne d'en-tete ?
    Par rastoix dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 08/11/2006, 10h25
  2. SQL Server Time out sur Access
    Par Ronin-MK dans le forum Access
    Réponses: 2
    Dernier message: 14/06/2006, 20h42
  3. [SQL Server] Créer la copie d'une ligne
    Par joeln3 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 01/06/2006, 16h54
  4. [SQL Server] UPDATE d'un ensemble de lignes
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2006, 15h56
  5. [SQL server 2005] caractère de retour à la ligne
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/02/2006, 14h34

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