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 :

xp_cmdshell et BCP [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut xp_cmdshell et BCP
    Bonjour à tous,

    J'ai mis en place un fech dans une procédure stockée, qui, après avoir lu une table, exporte des données dans un fichier texte différent à chaque itération.
    Le première itération se passe toujours bien, le fichier est correctement écrit dans le répertoire désigné.
    A partir de la seconde boucle, même si la préparation de l'exportation se déroule normalement, le nouveau fichier n'est plus créé.

    Je ne comprends pas pourquoi, peut-être thread bloqué ou autre process ...

    voilà un exemple de mon code

    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
    55
    56
    57
    58
    59
    60
    61
    62
     
    ALTER PROCEDURE [dbo].[ps_EDI_LAUCH_INVOIC]
    	@p_sENV varchar(30)
    AS
     
     
    DECLARE @iENTFAC_NUMFAC int
    --traitement edi
    DECLARE @sRESULT char(16)
    DECLARE @sREP varchar(150)
    DECLARE @sCMD varchar(2000)
    DECLARE @sNOMFIC varchar(50)
     
    --initialisation de la commande BCP
    SET @sCMD = 'master..xp_cmdshell ''BCP "SELECT FLIGNE FROM KLAUS.dbo.EDIJDE_FICHIERS WHERE DOCNUM = #document#"  queryout "#fichier#" -c -t; -T -Usa -SWIPRD065'''
    SELECT @sREP = PARAM.ZONEPAR1+'\' FROM PARAM WHERE PARAM.TYPEPAR = 'EDIREP' AND PARAM.CODEPAR = @p_sENV
     
    SET NOCOUNT ON
     
    DECLARE curseur CURSOR FOR
    	SELECT TOP 1 ENTFAC.NUMFAC
    	FROM ENTFAC WITH (NOLOCK)  
    	 INNER JOIN EDIJDE_PARTN WITH (NOLOCK) ON EDIJDE_PARTN.CLIENT = ENTFAC.CLIFAC 
    	 AND EDIJDE_PARTN.DIVISION = ENTFAC.DIVISION AND EDIJDE_PARTN.MESCOD = 'INVOIC01' 
    	 AND EDIJDE_PARTN.ACTIVE = '1' 
    	WHERE ENTFAC.TOPEDI <> '2'  AND ENTFAC.TOPCOMPTA = '1' ORDER BY NUMFAC
     
    OPEN curseur
    FETCH NEXT FROM curseur INTO @iENTFAC_NUMFAC
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
    	IF (@@FETCH_STATUS <> -2)
    	BEGIN
    		EXECUTE dbo.ps_EDIJDE_INVOIC @iENTFAC_NUMFAC, @sRESULT OUTPUT
    		IF (@sRESULT IS NOT NULL)
    		BEGIN
    			PRINT @sRESULT
    			--préparer le nom du fichier
    			SELECT @sNOMFIC = 'INVOIC01_'+CAST(@iENTFAC_NUMFAC AS varchar)+'_'+dbo.fn_UserDateTime('DATETIME',GETDATE())+'.txt'
    			--le chemin de collecte
    			SET @sREP = @sREP+@sNOMFIC
     
    			SET @sCMD = REPLACE(@sCMD, '#document#', @sRESULT)
    			SET @sCMD = REPLACE(@sCMD, '#fichier#', @sREP)
    			EXECUTE (@sCMD) -- SELECT @sCMD
     
    			--mettre à jour les fichiers log
    			UPDATE EDIJDE_FICHIERS SET NOMFIC = @sNOMFIC, STATUS = '50' WHERE DOCNUM = @sRESULT
    			UPDATE EDIJDE_DOC SET STATUS = '50' WHERE DOCNUM = @sRESULT
     
    			--mettre à jour la facture
    			UPDATE ENTFAC SET ENTFAC.TOPEDI = '2', ENTFAC.DOCNUM = @sRESULT WHERE ENTFAC.NUMFAC = @iENTFAC_NUMFAC
    		END ELSE
    		BEGIN
    			UPDATE EDIJDE_FICHIERS SET NOMFIC = @sNOMFIC, STATUS = '59' WHERE DOCNUM = @sRESULT
    			UPDATE EDIJDE_DOC SET STATUS = '59' WHERE DOCNUM = @sRESULT
    		END
    	END
    	FETCH NEXT FROM curseur INTO @iENTFAC_NUMFAC
    END
    DEALLOCATE curseur
    SET NOCOUNT OFF
    Merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    J'ai du mal à comprendre comment vous pouvez effectuer plusieurs passes dans la boucle, sachant que la requete de définition de votre curseur contient un TOP (1) ???

    Mais le problème vient surtout du fait que vous ne réinitialisez pas la variable @sCMD en fin de boucle.
    Du coup, au deuxième passage, elle ne contient plus les flags #document#' et '#fichier# (remplacés lors de la première passe). Donc, vous réécrivez sans cesse dans le même fichier.

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour aieeeuuuuu

    Oui effectivement, j'ai laissé le TOP 1 qui m'avait servi pour faire des tests.
    Sinon votre piste était la bonne, c'est effectivement la variable @sCMD, qui était mal initialisée. A chaque itération, le fichier était écrasé à cause de ça.

    Désolé pour ce manque d'attention.
    Merci beaucoup pour cette salutaire intervention.
    Je clos le fil

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

Discussions similaires

  1. Probleme d'apostrophe xp_cmdshell bcp
    Par laurecis89 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2010, 09h37
  2. Réponses: 3
    Dernier message: 06/08/2004, 11h12
  3. [tomcat] bcp de choses inutiles au démarrage du serveur
    Par iubito dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 23/06/2004, 20h10
  4. Réponses: 4
    Dernier message: 04/12/2003, 08h12
  5. BCP marche quand il veut !!!!
    Par chris92 dans le forum Outils
    Réponses: 2
    Dernier message: 24/03/2003, 09h41

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