Exporter vers un fichier CSV les résultats d'un SELECT
Bonjour,
Je suis nouveau sur le forum, et surtout dans l'utilisation de SQL Server, donc excusez-moi si je ne comprends pas rapidement ou si je dis/fais des bêtises en postant ici ; pour éviter d'en faire, j'ai commencé par faire une recherche sur le forum pour mon problème avant de poster (mais n'ai rien trouvé).
Donc, comme le dit mon titre, je voudrais exporter vers un fichier CSV les résultats d'une commande SQL me sélectionnant des entrées répondant à certains critères.
Est-ce que quelqu'un aurait une idée pour faire ça (simplement, si possible, je débute) ?
Suite à mes recherches, j'ai bien trouvé une page, sur le site de Microsoft, qui semblait répondre parfaitement à mon problème, mais la procédure décrite est un peu compliquée, et surtout elle nécessite un fichier que je ne peux pas télécharger (introuvable sur le site).
La page en question est : http://msdn.microsoft.com/fr-fr/library/ms403304.aspx ("Procédure : copier en bloc un jeu de résultats SELECT (ODBC)").
Donc, si certains d'entre vous pouvaient m'expliquer comment faire, ça serait vraiment sympa.
Merci :-)
P.S : j'utilise SQL Server Standard Edition v8 si ça peut vous être utile.
Comment, où, écrire un batch DOS et/ou une commande avec la procédure xp_cmdshell ?
Merci à elsuket pour sa réponse et sa rapidité.
Elle m'a bien aidé puisque j'ai réussi à créer une procédure stockée que j'utilise avec l'Agent SQL Server.
Je ne l'avais pas précisé dans mon premier post mais la création du fichier CSV sera automatisée avec l'Agent SQL Server.
Mais il me reste quand même un souci : ma procédure stockée ne fonctionne pas ; elle me renvoie une erreur :
Code:
1 2 3 4 5 6 7
| SQLState = S0002, NativeError = 208
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]'NOM_DE_TABLE1' : nom d objet incorrect.
SQLState = S0002, NativeError = 208
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]'NOM_DE_TABLE2' : nom d objet incorrect.
SQLState = 37000, NativeError = 8180
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Les instructions ne peuvent pas être préparées.
(null) |
J'ai l'impression qu'il y a un problème d'accès aux tables, or je ne comprends pas pourquoi car ma procédure est stockée dans la même base de données que les tables utilisées dans la requête.
À votre avis, d'où vient le problème ?
P.S : merci encore elsuket, pour le lien vers la commande BCP qui est très utile, notamment pour l'exemple F.
Nouvelle erreur : "syntaxe du nom de fichier, répertoire ou volume"
C'est encore moi.
En fouillant un peu sur le forum, j'ai trouvé un sujet concernant mon dernier souci en date ; il s'agit du sujet de Nouss sur l'export BCP de données de longueur variables : http://www.developpez.net/forums/d64...server-2005-a/
J'ai repris le code de sa requête et l'ai adapté à mes besoins (exporter les résultats d'une requête vers un fichier CSV périodiquement) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| DECLARE @L_CURRENTDATE DATETIME
DECLARE @L_OUT_PATH VARCHAR(100)
DECLARE @L_OUT_FILENAME VARCHAR(100)
DECLARE @QUERY NVARCHAR(4000)
SET @L_CURRENTDATE = GETDATE()
SET @L_OUT_PATH = 'C:' /* 'C:\' normalement mais j'ai ici retiré le \ devant l'apostrophe pour avoir une coloration syntaxique correcte */
SET @L_OUT_FILENAME = 'Export.csv'
SET @QUERY = '""SELECT * FROM MA_TABLE_1, MA_TABLE_2 WHERE (...)"' /* je passe les détails de ma requête SQL */
SET @QUERY = 'bcp '+@QUERY+' queryout ' + @L_OUT_PATH + @L_OUT_FILENAME + ' -c -T'
SET @QUERY = 'execute master.dbo.xp_cmdshell '+''''+@QUERY+''''
EXECUTE master.dbo.sp_executesql @QUERY,N'@L_CURRENTDATE DATETIME',@L_CURRENTDATE |
J'exécute ce code à l'aide de l'analyseur de requêtes SQL, et dans le volet des résultats j'ai :
Code:
1 2
| Syntaxe du nom de fichier, de répertoire ou de volume incorrecte.
NULL |
J'ai modifié le code en changeant de volume, ça n'a rien changé.
J'ai aussi modifié le code en m'inspirant de la documentation Microsoft sur la commande BCP : j'ai ainsi supprimé le volume (C:\) devant le nom de mon fichier.
Mais j'ai alors eu un autre message d'erreur : "Le fichier spécifié est introuvable."
Y aurait-il une âme charitable pour m'aider sur ce point ?
J'ai l'impression d'être à deux doigts de toucher le but ; c'est frustrant.
Merci d'avance :-)
NativeError > [Microsoft][ODBC SQL Server Driver][SQL Server]
Citation:
Envoyé par
mikedavem
J'ai enlevé le 2ème apostrophe devant votre SELECT et corrigé le path (en rouge)
Est ce que ca marche mieux ?
Par contre il faut faire attention à avoir les droits pour accéder à la racine C:\ avec sqlserver ...
Merci mikedavem, mais avec ce code je reviens au message d'erreur précédent :
Code:
1 2 3 4 5 6 7
| SQLState = S0002, NativeError = 208
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]'MA_TABLE_1' : nom d objet incorrect.
SQLState = S0002, NativeError = 208
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]'MA_TABLE_2' : nom d objet incorrect.
SQLState = 37000, NativeError = 8180
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Les instructions ne peuvent pas être préparées.
NULL |
- Pour l'apostrophe de la cible, je l'ai retiré seulement pour poster le code ici, sinon je l'utilisais bien dans mon code.
- Le fait de retirer le " devant mon SELECT ... me fait afficher le code d'erreur.
- Concernant les droits pour accéder à la racine (j'ai mis la racine parce que c'est plus rapide à écrire, mais j'aurai pû mettre n'importe quel autre chemin), j'ai vérifié les droits gérés par Windows :
http://www.imagefreehost.com/files/2...6792406938.jpg
Ainsi :
- pour Administrateurs et SYSTEM, y a tous les droits
- pour CREATEUR PROPRIETAIRE et Tout le monde, y aucun droits
- et pour Utilisateurs, il y a "Lecture et exécution", "Affichage du contenu du dossier" et "Lecture".
Qu'en pensez-vous ?
[Base].[Schema].[Table] ?
Citation:
Envoyé par
mikedavem
Et en qualifiant pleinement le nom de vos tables (SELECT * FROM [Base].[Schema].[Table])?
J'ai essayé en mettant le NOM_BDD.MA_TABLE_1(.mon_CHAMP pour le WHERE) et ça n'a rien changé.
Qu'entendez-vous pas [Schema] ? (Je rappelle que c'est la première fois que j'utilise SQL Server.)
Il faut mettre le schéma ou deux points (..) dans nos commandes devant nos tables.
Citation:
Envoyé par
mikedavem
Un schéma est simplement un conteneur d'objets (tables, vues, procédures etc...) où vous pouvez définir des droits (Explication simplifiée)
Par défaut le schéma créé est dbo.
Essayez [MABASE].[dbo].[MATABLE] ou encore [MABASE]..[MATABLE]
++
Merci beaucoup !
C'était bien à cause du schéma.
Et voilà un sujet (et une première partie de mon travail) de résolu !
Merci à mikedavem et à elsuket pour votre aide.
@ +