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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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 émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    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 chevronné
    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
    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
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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 chevronné
    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
    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 régulier
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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)

  8. #8
    Membre chevronné
    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
    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.

  9. #9
    Membre chevronné
    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
    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.

  10. #10
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    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

  11. #11
    Membre chevronné
    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
    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.

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