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

MS SQL Server Discussion :

[SQL200] Export d'une table dans un fichier avec Transact-SQL


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [SQL200] Export d'une table dans un fichier avec Transact-SQL
    Bonjour à tous,

    Je dois exporter une table (dont le nom des champs met inconnues à part la clef primaire 'IdBDDDATA') dans un fichier pour le fournir au client tous les jours sur un serveur ftp.

    Pour écrire les données dans le fichier, pas de problème. J'utile les procédures données par SQLpro : http://www.developpez.net/forums/showthread.php?t=83953

    Mais mon soucis est au niveau de la récupération des données :
    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
    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
     
    	DECLARE @colonne varchar(30)	
    	DECLARE @Ligne varchar(1000)
     
    	DECLARE @TABLE_NAME varchar(30)
    	SET @TABLE_NAME = 'BDDDATA'
     
    	--PRINT @TABLE_NAME
     
    	DECLARE @sql varchar(1000)
     
    	DECLARE @IdBDDDATA numeric
     
    	DECLARE Cursor_Enreg CURSOR FOR SELECT IdBDDDATA FROM @TABLE_NAME ORDER BY IdBDDDATA
     
    	OPEN Cursor_Enreg
     
    	FETCH next FROM Cursor_Enreg INTO @IdBDDDATA
     
    	WHILE @@fetch_status = 0 
    	BEGIN
     
    		SET @Ligne ='"'
     
    		DECLARE Cursor_NameCol CURSOR LOCAL FOR 
    		SELECT   COLUMN_NAME
    		FROM INFORMATION_SCHEMA.COLUMNS
    		WHERE TABLE_NAME = @TABLE_NAME 
     
    		OPEN Cursor_NameCol  
     
    		FETCH next FROM Cursor_NameCol INTO @colonne
     
    		WHILE @@fetch_status = 0 
    		BEGIN
    			DECLARE @ValChp nvarchar(1000)
    			SET @sql = 'SELECT @ValChp = [' + @colonne + '] FROM dbo.' + @TABLE_NAME + ' WHERE IdBDDDATA= ' + CONVERT(nvarchar(500),@IdBDDDATA)
    			EXEC(@sql)
    			SET @Ligne = @Ligne + '";"' + @ValChp
    			FETCH next FROM Cursor_NameCol INTO @colonne
     
    		END 
    		CLOSE Cursor_NameCol 
    		DEALLOCATE Cursor_NameCol 
     
    		SET @Ligne = @Ligne + '"'
    		PRINT @Ligne
    		-- écrit cette ligne dans le fichier
     
    	FETCH next FROM Cursor_Enreg INTO @IdBDDDATA
     
    	END 
    	CLOSE Cursor_Enreg
    	DEALLOCATE Cursor_Enreg
    ce script provoque 2 erreurs :

    - Serveur*: Msg 137, Niveau 15, État 2, Ligne 1
    La variable '@TABLE_NAME' doit être déclarée.
    donc pour résoudre cette première erreur , je met le nom de la table directement dans la requete au lieu de le passer dans une variable mais cela est temporaire car je devrais a terme le faire sur plusieurs table

    - Serveur*: Msg 137, Niveau 15, État 1, Ligne 1
    La variable '@ValChp' doit être déclarée.
    et là je ne vois pas comment corriger ça

    merci d'avance pour votre aide , cela fait plusieurs jours que cherche des solutions.
    C'est mon premier script en transact SQL, soyez indulgent

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    c'est quand meme compliqué ton truc là,

    pour la deuxieme erreur, c'est parce que ta requete dynamique n'est pas bonne.

    Il faut que tu utilise une table temporaire :

    http://sqlserver.developpez.com/faq/?page=Jeu#Jeu8

    Moi je ferais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WHILE @@fetch_status = 0 
    BEGIN
     
    DECLARE @ValChp nvarchar(1000)
    SET @sql = 'SELECT [' + @colonne + '] INTO TableTempo FROM dbo.' + @TABLE_NAME + ' WHERE IdBDDDATA= ' + CONVERT(nvarchar(500),@IdBDDDATA)
    EXEC(@sql)
    SET @ValChp = (SELECT * FROM TableTempo) --il faut que la tabletempo n'est qu'une valeur 
    DROP TABLE TableTempo 
     
    END
    Pour la premiere erreur c'est la meme chose, il faut utiliser une requete dynamique. Mais je sais pas si c'est poissible dans un curseur, un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DECLARE Cursor_Enreg CURSOR FOR EXEC(@sql)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Le plus simple pour exporter les données d'une table dans un fichier est d'utiliser l'utilitaire BCP fournit avec SQL Server 2000.

    Cette utilitaire est très simple d'utilisation et passe par une commande DOS.

    Donc dans ton application tu récupère la liste des tables à exporter puis tu fais une boucle sur chacune de ces tables afin d'effectuer un export via BCP.

    C'est la manière la plus simple et la plus rapide d'opérer.

    Tu trouveras de la documentation sur cet utilitaire partout sur le net.

    En espérant t'avoir aidé.

    Cordialement,
    Nicolas L.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci HULK, pour ta réponse rapide

    le principe de ce que je veux faire c'est un export d'une table en un fichier csv avec des délimiteurs et séparateurs particuliers et les en-têtes de colonnes (ce que ne me permet pas la commande bcp) et je le fais en transact SQL aussi car le nom du fichier devra contenir la date et un numéro de version

    Voilà, j'espère que c'est un peu plus clair comme ça

    sinon, la réponse que tu m'as donné pour la 2° erreur marche à part que j'ai un problème de type maintenant
    les champs sont du type ntext
    Serveur*: Msg 279, Niveau 16, État 3, Ligne 43
    Les types de données text, ntext et image sont incorrects dans cette sous-requête ou cette expression d'agrégation.

    merci encore

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Madinico pour l'infos mais comme je l'ai dit précédament , je n'arrive pas à ce que je veux avec la commande bcp que j'avais déjà testé en première solution

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Si tu veux utiliser le BCP, il y a plein d'options qui permettent de formater le fichier en sortie. Pour le format csv, il te suffit de nommer ton fichier en finissant par l'extension .csv.
    Pour ajouter la date et l'heure dans le nom du fichier, il te suffit de générer tes noms de fichier par programmation.

    Les options pratique :
    -t; : pour délimiter les champs par des ;
    -r\r\n : pour identifier le caractère de fin de ligne.

    Pour mettre le nom de tes champs en première ligne, il te suffira de traiter ton fichier par programmation.

    C'est une solution comme une autre.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par bgd76
    Merci HULK, pour ta réponse rapide

    le principe de ce que je veux faire c'est un export d'une table en un fichier csv avec des délimiteurs et séparateurs particuliers et les en-têtes de colonnes (ce que ne me permet pas la commande bcp) et je le fais en transact SQL aussi car le nom du fichier devra contenir la date et un numéro de version

    Voilà, j'espère que c'est un peu plus clair comme ça

    sinon, la réponse que tu m'as donné pour la 2° erreur marche à part que j'ai un problème de type maintenant
    les champs sont du type ntext
    Serveur*: Msg 279, Niveau 16, État 3, Ligne 43
    Les types de données text, ntext et image sont incorrects dans cette sous-requête ou cette expression d'agrégation.

    merci encore
    Tu auras toujours des problèmes avec les champs ntext car se sont des champs memos. Leurs tailles étant très importante, tu ne pourras pas les conserver dans des variables nvarchar.
    Je te conseille donc de voir tronquer une partie des données afin de les récupérer.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    oui, je savais pour les séparateurs que on pouvait mettre ;
    mais pour mettre les valuers entre des guillemets comment on fait ?

    et puis que veux-tu dire par
    Pour mettre le nom de tes champs en première ligne, il te suffira de traiter ton fichier par programmation.
    Car, je ne veux pas faire autre chose qu'un script dans SQL-server (pas de programme en vb ou autres)

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Madinico
    Tu auras toujours des problèmes avec les champs ntext car se sont des champs memos. Leurs tailles étant très importante, tu ne pourras pas les conserver dans des variables nvarchar.
    Je te conseille donc de voir tronquer une partie des données afin de les récupérer.
    Comment dois-je faire pour tronquer une partie des données ?

    Merci

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par bgd76
    Comment dois-je faire pour tronquer une partie des données ?

    Merci
    Tu peux utiliser la fonction SUBSTRING afin de récupérer le début du champ ntext. La syntaxe de la fonction est disponible dans l'aide SQL.

    Cordialement,
    Nicolas L.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par bgd76
    oui, je savais pour les séparateurs que on pouvait mettre ;
    mais pour mettre les valuers entre des guillemets comment on fait ?

    et puis que veux-tu dire par
    Car, je ne veux pas faire autre chose qu'un script dans SQL-server (pas de programme en vb ou autres)
    Je pensais que tu pilotais ton script SQL Server à partir d'une application dans un autre langage.
    Pour mettre les champs de retour entre guillemets, je n'ai pas trouvé d'otpion correspondante dans l'aide de l'utilitaire mais c'est à creuser.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    bgd76 a écrit :
    oui, je savais pour les séparateurs que on pouvait mettre ;
    mais pour mettre les valuers entre des guillemets comment on fait ?
    je crois que c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT QUOTE(champ1) from table1

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2009, 01h43
  2. Réponses: 29
    Dernier message: 27/08/2008, 09h41
  3. exporter données d'une table dans un fichier .sql
    Par pierre2410 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/06/2007, 15h29
  4. Delphi7 - Export d'une table dans un fichier texte
    Par jer64 dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2006, 00h33
  5. Exporter une table dans un fichier excel
    Par david71 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/09/2005, 17h09

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