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

Développement SQL Server Discussion :

Exporter vers un fichier CSV les résultats d'un SELECT


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut 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.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour et bienvenue sur ce forum

    Vous avez la version 8 de SQL Server, qui est aussi appelée "2000"
    Sa documentation est disponible ici au téléchargement.

    Pour réaliser votre export, vous pouvez utilisez l'utilitaire en ligne de commande BCP.

    Vous pouvez écrire la commande SQL dans un batch DOS ou bien exécuter la commande avec la procédure stockée étendue xp_cmdshell

    En DOS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bcp "maRequeteSQL" queryout C:\toto.csv -t; -S monServeur\moninstance -U utilisateurSQL -P motDePasse
    Avec xp_cmdshell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @BCP VARCHAR(255)
    SET @BCP = 'bcp "maRequeteSQL" queryout C:\toto.csv -t; -S monServeur\moninstance -U utilisateurSQL -P motDePasse'
     
    EXEC Master.dbo.xp_cmdshell @BCP --, NO_OUTPUT
    @++

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut 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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :-)

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    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 ...

    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
    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

    ++

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut NativeError > [Microsoft][ODBC SQL Server Driver][SQL Server]
    Citation Envoyé par mikedavem Voir le message
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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 ?

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Et en qualifiant pleinement le nom de vos tables (SELECT * FROM [Base].[Schema].[Table])?

    ++

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut [Base].[Schema].[Table] ?
    Citation Envoyé par mikedavem Voir le message
    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.)

  9. #9
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    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]

    ++

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut Il faut mettre le schéma ou deux points (..) dans nos commandes devant nos tables.
    Citation Envoyé par mikedavem Voir le message
    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.

    @ +

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

Discussions similaires

  1. [2008] Problème d'export vers un fichier .csv
    Par Aeltith dans le forum SSIS
    Réponses: 3
    Dernier message: 09/03/2011, 11h20
  2. Réponses: 4
    Dernier message: 15/08/2008, 12h43
  3. exporter vers un fichier csv
    Par Beltegeuse dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/05/2008, 12h59
  4. [Macro]exporter une table vers un fichier.csv
    Par samca dans le forum IHM
    Réponses: 2
    Dernier message: 24/04/2007, 21h25
  5. [Oracle] export vers un fichier csv
    Par illegalsene dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/10/2005, 23h58

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