Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Outils
Outils Forum d'entraide sur les outils gravitant autour de MS-SQL Server, tels que bcp, TDS, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/11/2006, 16h17   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2003
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 18
Points : 11
Points : 11
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
rastoix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 18h07   #2
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

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

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Bonjour,

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

Code :
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 !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 11h46   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2003
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 18
Points : 11
Points : 11
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.
rastoix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 12h13   #4
Membre éprouvé
 
Inscription : juillet 2004
Messages : 437
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 437
Points : 451
Points : 451
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
ZERS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 14h12   #5
Candidat au titre de Membre du Club
 
Inscription : mai 2003
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 18
Points : 11
Points : 11
Par défaut Précisions

J'utilise un fichier de format pour ma commande bcp :
Code :
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.
rastoix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 14h44   #6
Membre éprouvé
 
Inscription : juillet 2004
Messages : 437
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 437
Points : 451
Points : 451
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.
ZERS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2006, 10h25   #7
Candidat au titre de Membre du Club
 
Inscription : mai 2003
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 18
Points : 11
Points : 11
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 :
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 :
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
rastoix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h38.


 
 
 
 
Partenaires

Hébergement Web