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 14/06/2011, 18h11   #1
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Par défaut SET NOCOUNT sans effet avec exec master..xp_fileexist

Bonjour à tous

J'ai créé une procédure qui me permet d'exporter les données d'une table dans un fichier csv, à l'aide de la commande print, en désactivant la sortie avec 'SET NOCOUNT ON' de l'affectation du nombre de lignes, et en redirigeant la sortie de mon script vers un fichier.
Tout fonctionnait parfaitement, jusqu'au moment où j'ai rajouté exec master..xp_fileexist, pour vérifier l'existence de mon fichier.
Il me rajoute dans mon fichier '(1 ligne affect‚e)', alors qu'il ne le fait pas pour les autres instructions...
Y'a t il une solution pour cela ?
Merci d'avance pour votre aide.

----------------------------------------------
SQL SERVER
8.00.194 RTM Personal Edition EngineEdition 1
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 19h29   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
NON, car c'est dans la proc xp que cette ligne est renvoyée et à moins de la redévelopper en C...
Mais pourquoi utiliser la commande PRINT alors que vous avez la possibilité d'utiliser bcp.exe qui est fait pour faire des import/export ????
(en 1000 fois plus rapide)

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 09h46   #3
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Merci pour la réponse!
Effectivement, c'est logique, et donc incontournable...
Je connais bcp et SSIS, mais la technique du print, me paraissait plus simple à mettre en oeuvre et efficace à la fois.
Je ne souhaite pas exporter une table en fait. J'ai une table avec une dizaine de champs, sur laquelle je fais une lecture, et je produis mon csv à partir de cette lecture. Le csv résultant doit faire une quarantaine de champs, dont certains sont vides, et où les autres sont construits à partir des différentes données de ma table intermédiaire.
Cela me convenait tout à fait jusqu'à l'utilisation de ce xp_fileexist...
Bref.. je vais voir autrement..
Merci encore!
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h01   #4
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Pour préciser un peu plus mon choix ... le fichier que je dois générer a un format spécial : voici à quoi doit ressembler mon fichier csv
Citation:
donneefixe1;donneefixe1
A_row1;A_row1;A_row1;A_row1;A_row1;A_row1;
B_row1;B_row1;B_row1;B_row1;
A_row2;A_row2;A_row2;A_row2;A_row2;A_row2;
B_row2;B_row2;B_row2;B_row2;
A_row3;A_row3;A_row3;A_row3;A_row3;A_row3;
B_row3;B_row3;B_row3;B_row3;
A_row4;A_row4;A_row4;A_row4;A_row4;A_row4;
B_row4;B_row4;B_row4;B_row4;

J'ai donc dans ma procédure qui commence par afficher la première ligne avec print, et ensuite un curseur qui boucle sur mes enregistrements, et qui produit chaque ligne à l'aide de deux print

Avec bcp, j'ai plus de contraintes et ça reste tabulaire et formaté...
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h42   #5
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
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 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Peux-tu montrer ton script ?
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h12   #6
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
CREATE PROCEDURE bdd.pr_export
AS
BEGIN
 
SET nocount ON
SET ansi_warnings off
 
declare @v_code varchar(20)
declare @d_datehdeb datetime
declare @d_datehfin datetime
 
declare @v_service varchar(4)
declare @v_pcharge varchar(10)
declare @v_site varchar(5)
declare @d_datecre datetime
declare @v_matri varchar(20)
declare @i_export integer
 
declare @v_datehdeb varchar(20)
declare @v_datehfin varchar(20)
 
declare @v_datecre varchar(20)
declare @v_etab varchar(2)
 
 
 
declare c_lect cursor FOR   
SELECT 
  CODE,
  DATEHDEB,
  [SECTION],
  PCHARGE,
  [SITE],
  DATECRE,
  UTILCRE,
  EXPORT
FROM
  table_origine
  WHERE export = 0 OR export IS NULL OR export = 1
  ORDER BY  code  ASC
 
open c_lect   
fetch c_lect INTO  
	@v_code, 
 	@d_datehdeb,
	@v_service, 
	@v_pcharge, 
	@v_site, 
	@d_datecre,
	@v_matri, 
	@i_export
 
 
	-- 1ère ligne type echange données 
IF (@@fetch_status = 0) print  'exchangeInterface;WO_IN;'
 
 
while (@@fetch_status = 0)   
begin   
	SET @v_code = replicate (0,6-len(cast(@v_code AS varchar)))+cast(@v_code AS varchar)
	SET @v_datecre = convert(varchar(20),@d_datecre,103) + ' ' + convert(varchar(20),@d_datecre,108)
    SET @v_datehdeb = convert(varchar(20),@d_datehdeb,103) + ' ' + convert(varchar(20),@d_datehdeb,108)
    SET @d_datehfin = dateadd(mi,1,@d_datehdeb)
    SET @v_datehfin = convert(varchar(20),@d_datehfin,103) + ' ' + convert(varchar(20),@d_datehfin,108)
    SET @v_etab = case @v_site when '1' then 'CQ' when '5' then 'MJ' else '0' end
 
    -- WO ligne éléments 
    print
    'WO' + ';' + 
    'OT-GA-' + @v_code  + ';' +
    'OT-GA-' + @v_code  + ';' +
    'Panne arret machine' + ';' +
 	@v_datehdeb + ';' +
    @v_datehfin + ';' +
    ';' +					-- 1 champs vide
    'URGENT;' +
    'PANNE;' +
	@v_service + ';' +
    ';;;;' +				-- 4 champs vides
    'TRUE;' +
    ';;;;;' +				-- 5 champs vides
	@v_pcharge + ';' +
    ';;;;;;;' +				-- 7 champs vides
	@v_etab + ';' +
    ';;;;' +				-- 4 champs vides
	@v_datecre + ';' +
	@v_matri + ';' +
    ';;;;;;;;;;;;;;;;;;;' 	-- 19 champs vides
 
    -- WOSTATUS ligne status 
    print 
    'WOSTATUS' + ';' + 
    'INPROGRESS' + ';' + 
    @v_matri + ';' +
    @v_datehdeb 
 
 
    UPDATE table_origine SET export = 1 WHERE code = @v_code
 
    fetch c_lect INTO  
      @v_code, 
      @d_datehdeb, 
      @v_service, 
      @v_pcharge, 
      @v_site, 
      @d_datecre,
      @v_matri, 
      @i_export 
end   
close c_lect   
deallocate c_lect    
 
 
END
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h52   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Faîtes ceci dans une table, temporaire globale d'une seule colonne de type VARCHAR(max), puis exportez cette table au format brut !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 13h01   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
En outre le curseur est inutile ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 14h35   #9
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Merci pour vos conseils,
Bon finalement, ma méthode n'est pas si logique que ça à priori...
Ok donc pour résumer, vous me conseillez de créer une table temporaire dans laquelle je mets mes données concaténées dans un seul champ.
Et si mon curseur est inutile, pourquoi pas faire directement un select sur ma table, en concaténant les champs directement.. ?


Merci encore pour votre aide
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 14h48   #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
Citation:
Envoyé par droog Voir le message
Merci pour vos conseils,
Et si mon curseur est inutile, pourquoi pas faire directement un select sur ma table, en concaténant les champs directement.. ?
Personnellement, c'est ce que je ferais !
Un simple SELECT + update en bcp : je ne vois pas dans votre script ce qui vous empêche de faire ça en bcp.

voire même, si l'ordre des couples de lignes n'a pas d'importance (ce dont je doute car vous mettez ORDER BY code ASC), vous pourriez faire un simple UPDATE / OUTPUT en bcp (reste à ajouter l’entête, ce que je ferais en batch...)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h16   #11
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Merci pour ton message, mais je suis allé un peu vite en besogne...
En effet j'ai 2 lignes pour chaque enregistrement à générer... donc je suis effectivement obligé de passer d'abord par une table temporaire pour générer ces lignes, et ensuite de faire un select sur cette table temporaire...

Mais par contre je ne vois pas comment me passer de mon curseur du coup.... car j'ai 2 lignes à créer pour chaque enregistrement de ma table...
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h53   #12
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
cela n’empêche pas

Aux erreurs de copier coller près, je pense que cette commande passée a bcp remplace la totalité de la procédure stockée, sans curseur ni table temporaire... :

Code SQL :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
SELECT txt
FROM (
	SELECT 0 AS rang, 0 AS code, 'exchangeInterface;WO_IN;' AS txt
	UNION ALL
	SELECT 
		1 ,
		code,			
		'WO' + ';' + 
		'OT-GA-' + REPLICATE (0,6-LEN(CAST(CODE AS varchar)))+CAST(CODE AS varchar)  + ';' +
		'OT-GA-' + REPLICATE (0,6-LEN(CAST(CODE AS varchar)))+CAST(CODE AS varchar)  + ';' +
		'Panne arret machine' + ';' +
 		CONVERT(varchar(20),DATEHDEB,103) + ' ' + CONVERT(varchar(20),DATEHDEB,108) + ';' +
		CONVERT(varchar(20),DATEADD(mi,1,DATEHDEB),103) + ' ' + CONVERT(varchar(20),DATEADD(mi,1,DATEHDEB),108) + ';' +
		';' +					-- 1 champs vide
		'URGENT;' +
		'PANNE;' +
		[SECTION] + ';' +
		';;;;' +				-- 4 champs vides
		'TRUE;' +
		';;;;;' +				-- 5 champs vides
		PCHARGE + ';' +
		';;;;;;;' +				-- 7 champs vides
		case [SITE] when '1' then 'CQ' when '5' then 'MJ' else '0' end + ';' +
		';;;;' +				-- 4 champs vides
		CONVERT(varchar(20),DATECRE,103) + ' ' + CONVERT(varchar(20),DATECRE,108) + ';' +
		UTILCRE + ';' +
		';;;;;;;;;;;;;;;;;;;' 	-- 19 champs vides
		+ CHAR(13) --saut de ligne
		+ 'WOSTATUS' + ';' + 
		'INPROGRESS' + ';' + 
		UTILCRE + ';' +
		CONVERT(varchar(20),DATEHDEB,103) + ' ' + CONVERT(varchar(20),DATEHDEB,108) 
	FROM
		table_origine
	WHERE 
		export = 0 
		OR export IS NULL 
		OR export = 1
) T
ORDER BY  rang, code  ASC;
 
UPDATE table_origine 
    SET export = 1 
WHERE 
	export = 0 
	OR export IS NULL 
	OR export = 1
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 16h36   #13
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Effectivement c'est pas bête
Du coup je me retrouve avec une simple requête.. pas mal
Je vais mettre ça en oeuvre et je vous tiens au courant.

@SQLpro
Citation:
Envoyé par SQLpro
Faîtes ceci dans une table, temporaire globale d'une seule colonne de type VARCHAR(max), puis exportez cette table au format brut !
J'ai essayé cette solution, et ça fonctionne bien tant que j'exécute dans mon client, mais dès que je passe en mode console avec bcp, j'ai systématiquement cette erreur :
Citation:
SQLState = S1010, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]Erreur de séquence de fonction
droog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 09h56   #14
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 26
Points : 6
Points : 6
Envoyer un message via ICQ à droog Envoyer un message via MSN à droog Envoyer un message via Skype™ à droog
Bon juste pour terminer cette discussion qui a progressivement dérivé sur autre chose ...

J'ai finalement basculé sur l'utilisation de bcp, et supprimé mon curseur.
Par contre j'ai conservé ma procédure stockée, pour avoir dans mon batch quelque chose de plus lisible.

Le problème que je rencontrais dans mon message précédent (Erreur de séquence de fonction) a été résolu. En fait cela venait de l'utilisation de table temporaire dans bcp. Et aprés avoir parcouru plusieurs forums, j'ai finalement réussi à le faire fonctionner en ajoutant "set fmtonly off" dans l'entete de ma procédure.
Merci encore à vous tous pour vos différentes solutions qui m'ont permis d'améliorer mon export, et d'enrichir un peu plus mes connaissances en Transact-SQL
droog 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 05h20.


 
 
 
 
Partenaires

Hébergement Web