Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 29/12/2010, 18h29   #1
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Par défaut Peut-on exporter en txt via T-SQL ?

Bonjour,

Je cherche à savoir si on peut faire des exports dans un txt d'infos dans un txt selon un format précis ?


Exemple : je voudrais obtenir dans un txt nommé toto_29122010.txt

Citation:
#DEPART
DUPONT
JEAN

45 avenue de la liberté

75000
PARIS
44
# AUTRE
....
Les données provenant d'une table selon critère(s) et d'autres provenant de calculs, concaténations, extraction de chaines, .. ou données en dur.

J'ai cherché sur le net, il semble bien que ce soit possible mais je n'ai pas réussis à trouver d'exemples assez clair pour mon faible niveau.

Auriez-vous un exemple simple ? ou pourriez-vous m'aiguiller dans ma recherche sur des mots clés du code T-SQL ?

Merci
Thibault
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 19h51   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
utiliser l'utilitaire BCP avec un fichier de format (.fmt)

Pour plus d'infos
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 20h08   #3
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour cette notion de fmt et pour le lien.
J'ai lu rapidement le lien et j'ai l'impression que cela ne réponds pas à mon besoin :
faire un export en txt sur un format particulier (chaque champ à la ligne et non en colonne) et possibilité d'exporter des valeurs définies ou calculées.
Pour reprendre mon exemple du 1er message, la valeur 44 serait, par exemple le champ [Prix_Unit]*0,5.
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 20h50   #4
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Utilise alors simlpement BCP
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 07h18   #5
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour la réponse. J'ai cherché plusieurs heures entre hier soir et ce matin des exemples de bcp. Mais je n'ai pas réussi à en trouver un seul qui donne un txt affichant chaque champ à la ligne.

J'ai trouvé notamment ce genre de code : (avec master.dbo.xp_cmdshell et BCP)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @BCPReq VARCHAR(120)
DECLARE @BCPResultINT
 
--Construction de la commande BCP pour exporter la table vers un fichier
SET @BCPReq = 'bcp afer.dbo.WEBFALPA out c:\webas400\archive\export\WEBFALPA -c -t"|" -U sa -P'
--Execution de la commande BCP
EXEC @BCPResult = master.dbo.xp_cmdshell @BCPReq
 
--Controle du résultat
IF (@BCPResult= 0)
	PRINT 'Success'
ELSE
	PRINT 'Failure'

Mais je ne comprends pas comment obtenir le résultat en lignes.
Exemple : ma requête me sort 2 lignes :
Citation:
DUPONT/FIAT/1000
DURANT/FORD/120
L'export txt par le BCP donnerait qq chose comme :
Citation:
DUPONT;FIAT;1000
DURANT;FORD;120
Mais moi, Je voudrais obtenir un txt donnant :
Citation:
#FLAGDEBUT
#ENREGISTREMENT1
DUPONT
FIAT
1
1000
500
#ENREGISTREMENT2
DURANT
FORD
1
120
60
#FLAGFIN
#
1 étant une valeur forcée (tout le temps la même)
500 ou 60 étant la valeur précédente divisée par 2
Les Lignes de dièses étant importantes pour moi.

Qq'un aurait-il un exemple ?

Merci
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 10h46   #6
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
dans ce cas il faut au moins 2 étapes :

1) bcp pour exporter comme tu l'as obtenu

2) traitement du fichier de sortie pour avoir le résultat que tu souhaites.
Pour ce traitement je pense à la fonction split qui existe dans beaucoup de langage de programmation mais n'existe pas de façon native sous T-SQL. Mais sur internet tu peux trouver des fonctions T-SQL qui permettent de split des chaines de caractères.
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 15h51   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Je me permet de m'immiscer...

pour faire ce genre de chose, pourquoi ne fais-tu pas un script externe, genre en powershell ou autre :
Tu lances ta requete pour récupérer les données, et ensuite tu génère ton fichier de sortie. A mon avis, ca sera plus simple.

As-tu des contraintes qui t'empêchent de faire ainsi ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 16h22   #8
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Moi je me permets de vous demander a quoi va vous servir ce fichier texte formatté ? Est ce pour une autre application ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 17h30   #9
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
merci pour vos lectures.

Je ne connais pas powershell : je vais chercher des infos sur le net sur le champs pour voir si je peux l'aborder facilement.

Mon but est effectivement de générer un fichier txt qui sera importable par un logiciel tiers.


Je suis persuadé à 100% d'avoir déjà vu ce genre de code en T_SQL (sans être certain, je crois que c'était dans une procédure stockée) sur une base SQL chez un client mais impossible de savoir où je l'ai vu et donc impossible de le lire.

Je pourrais partir vers un second traitement externe en vb mais justement si c'est possible dans SQL Server, je voudrais essayer d'apprendre à le faire : pour ne pas mourir idiot.

A+
thibault
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 17h59   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
je disais powershell, car en fonction de votre version de SQL Server, powershell sera peut être déjà installé.

mais sinon n'importe quel langage fera l'affaire. Si vous avez un serveur PHP et que vous maitrisez un minimum PHP, un script CGI plannifié ne vous prendra que quelques minutes a faire...
disons que pour ce que vous voulez faire, un langage de programmation sera plus adapté que T-SQL.

Après je ne connais pas toutes vos contraintes...

Vous dites que c'est pour un logiciel tiers... de quel type ? une appli web ? vous avez les sources/la main dessus ? bref, sans connaitre le contexte précis, on ne peux que donner des pistes.. a adapter a vos besoins précis.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2010, 22h54   #11
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Une idée pour traiter les fichiers générés après le bcp.

Exemple
---------------

Si le fichier généré après bcp (fichier d'entrée) est : 'E:\FichierEntree.txt'
Citation:
1,lundi
2,mardi
3,mercredi
4,jeudi
5,vendredi
6,samedi
7,dimanche
En exécutant

Code :
1
2
3
4
5
6
7
8
9
10
DECLARE @CMD NVARCHAR(4000) -- Commande à exécuter 
  , @FichierEntree NVARCHAR(255) -- Fichier à traiter
  , @FichierSortie NVARCHAR(255) -- Fichier sortie
 
BEGIN  
SET @FichierEntree = 'E:\FichierEntree.txt' 
SET @FichierSortie = 'E:\FichierSortie.txt'  
SET @CMD = 'FOR /f "tokens=1,2 delims=," %a in ('+ @FichierEntree +') do ( echo %a >> '+ @FichierSortie + '|'+ 'echo %b >> ' + @FichierSortie + ')' 
EXEC master..xp_cmdshell @CMD
END
On obtient

Le fichier de sortie 'E:\FichierSortie.txt'
Citation:
1
lundi
2
mardi
3
mercredi
4
jeudi
5
vendredi
6
samedi
7
dimanche

Tu peux d'inspirer de cet exemple pour écrire ta procédure stockée


A+
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 07h39   #12
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci ce dernier exemple est très utile !!

Je laisse ouvert ce post pour l'instant par rapport à Mikedavem et aieeeuuuuu.
Au cas où, ils auraient une autre idée.

Dans le même style de ce dernier exemple, est-il possible de directement splitter le résultat d'une requête en x variable. (et ainsi pouvoir écrire mon txt, ligne à ligne) ?

exemple : j'ai un :
Code :
SELECT NOM, PRENOM FROM CLIENTS
et j'aurais qq chose du style (code faux puisque je ne sais pas le faire) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@nom=NOM
@prenom=PRENOM
@Flagdébut='flag début'   ' variable texte en dur
@flagflin='flag fin'
...
SET @ligne1 = @flagdébut
SET @ligne2 = @nom
SET @ligne3 = @prenom
...'
--Execution de la commande BCP
EXEC @ligne1 = master.dbo.xp_cmdshell @ligne1
EXEC @ligne2 = master.dbo.xp_cmdshell @ligne2
EXEC @ligne3 = master.dbo.xp_cmdshell @ligne3
EXEC @ligne4 = master.dbo.xp_cmdshell @ligne4
'
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 10h55   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par tibofo Voir le message
Je laisse ouvert ce post pour l'instant par rapport à Mikedavem et aieeeuuuuu.
Au cas où, ils auraient une autre idée.
J'en ai plein

J'en ai déjà évoquée une qui me parait la plus générique : un script planifié sous windows dans le langage de ton choix et ce pour deux raisons :
1/ Ce que tu cherche a faire est plus de la mise en forme que du traitement des données, c'est donc plus le rôle d'un langage que d'un SGBDR. En plus ca te prendra pas plus d'une heure d'écrire un tel script (plus dix secondes pour le planifier sur Windows)

2/ activer le cmdShell, personnellement, j'évite a tout prix. Il est d'ailleurs désactivé par défaut pour les même raisons que celles qui me poussent a ne pas l'activer...

Donc je pense que la solution de zinzineti est celle qui répond le mieux a ta question, mais pas forcement a ton besoin, c'est pourquoi je te demandais quelques infos supplémentaires sur le contexte.
que va devenir le fichier généré par la suite ? être insère manuellement, automatiquement, par quel processus ?
A mon avis tu peux trouver une solution beaucoup plus simple, et avec une meilleure sécurité, en prenant un peu de recul sur ton problème... ou en nous donnant plus d'infos
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2010, 17h23   #14
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Dans ce cas, je ne vais pas chercher à aller + loin dans T-SQL.

Mon métier n'est pas le dév. C'est + une réponse en cas de "petites" demandes annexes. C'est pourquoi j'évite de partir sur plusieurs outils pour éviter de me "perdre". j'aurais préféré faire tout dans SQL management (ainsi j'aurais "progressé" et n'aurais pas fait un bout à gauche et l'autre à droite)

Je pense que dans ce cas, je vais partir sur une base Access, faire mes requêtes et mon vba pour la partie Export.

Merci à tous et bonne année
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h26.


 
 
 
 
Partenaires

Hébergement Web