begin process at 2013 05 24 15:09:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Procédure

 > SQL-SERVER PROC. SEND_FTP

SQL-SERVER PROC. SEND_FTP


 Information sur la source

Note :
Aucune note
Catégorie :Procédure Classé sous :PROCEDURE, SENDFTP, SQLSERVER Niveau :Initié Date de création :26/06/2012 Date de mise à jour :05/09/2012 13:12:28 Vu :3 847

Auteur : yann_lo_san

Ecrire un message privé
Site perso
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Procédure stockée permettant d'envoyer un fichier depuis le serveur de BDD vers un FTP (unix ou windows)
en construisant un fichier de commandes temporaire par BCP (fichier supprimé en fin de process)
Marche sur n'importe quelle base de données SQL-server 2005 ou +
Suffit d'exécuter le create procedure
Si le param @rep_fait existe, le fichier source est "déplacé" vers ce rep. après le "send" sinon il est supprimé

Source

  • -- =============================================
  • -- Author: Yannick Laussanne
  • -- Create date: 26/06/2012
  • -- Description: Envoi d'un fichier existant sur le srv de BDD vers un FTP Unix ou Windows
  • --
  • -- On construit un fichier de commandes ftp temporaire et on exécute
  • -- la commande console ftp -s:"fichier_de_cmd" serveurFtp
  • --
  • -- Attention : si le param @rep_fait ne commence pas par [DISQUE]:\ on le concatène à @path
  • -- sinon on le prend tel quel
  • -- =============================================
  • CREATE PROCEDURE [dbo].[util_SendFTP]
  • @serveurFTP nvarchar(300), /*serveur FTP sans préfixe*/
  • @loginFTP nvarchar(150), /*login ftp*/
  • @passFTP nvarchar(150), /*pass ftp*/
  • @workingDirFTP nvarchar(150), /*doit-on se positionner sur un ou plusieurs sous répertoire du ftp*/
  • @path varchar(255), /*Répertoire physique de travail sur le srv de BDD*/
  • @file varchar(255), /*Fichier dans le "@path" à envoyer sur le ftp*/
  • @rep_fait varchar(255), /*Répertoire de move final pour les fichiers envoyés, si vide, supprime le fichier source*/
  • @loginBCP varchar(50), /*login de la connexion SQL pour BCP*/
  • @passBCP varchar(50), /*pass de la connexion SQL pour BCP*/
  • @msgRet varchar(500) output, /*Eventuellemnt, retourne un msg d'erreur*/
  • @debug bit = 0 /*Affiche les commandes*/
  • AS
  • BEGIN
  • SET NOCOUNT ON;
  • SET @msgRet = 'OK'
  • DECLARE
  • @cmd varchar(4000),
  • @retShell int,
  • @retShellFTP int,
  • @req varchar(2500),
  • @tmpCMDFTP varchar(100), /* Fichier de cmd FTP temporaire */
  • @fileToSend varchar(255) /* path + file */
  • /* Normalement, les paramètres de chemin ont été validés par l'appelant */
  • IF RIGHT(@path,1) != '\'
  • SET @path = @path + '\'
  • /* Le fichier à envoyer */
  • SET @fileToSend = @path + @file
  • /* Le Fichier de cmd FTP temporaire */
  • SET @tmpCMDFTP = 'tmpCMDFTP_' + replace(CONVERT(varchar,GETDATE(),114),':','') + '.txt'
  • /* Crée et rempli le fichier de cmd FTP tmp en passant par une table de travail */
  • DECLARE @tableTravail nvarchar(150) ; SET @tableTravail = db_name() + N'.dbo.W_CMDFTP_TMP'
  • IF OBJECT_ID(@tableTravail, N'U') is null
  • CREATE TABLE W_CMDFTP_TMP (
  • _cpt int identity(1,1),
  • _ligne nvarchar(1024)
  • );
  • ELSE
  • TRUNCATE TABLE W_CMDFTP_TMP;
  • /* Construit les commandes selon le protocole ftp -s */
  • INSERT INTO W_CMDFTP_TMP VALUES(@loginFTP); /*login*/
  • INSERT INTO W_CMDFTP_TMP VALUES(@passFTP); /*pass*/
  • IF ISNULL(@workingDirFTP,'') != '' /*se place sur un sous-rep*/
  • INSERT INTO W_CMDFTP_TMP VALUES('cd ' + @workingDirFTP);
  • IF CHARINDEX('/', @loginFTP)>0 /*si login unix/EDI*/
  • BEGIN
  • INSERT INTO W_CMDFTP_TMP VALUES('prompt'); /*obligatoire pour faire marcher le mode interractif*/
  • INSERT INTO W_CMDFTP_TMP VALUES('prompt'); /*obligatoire pour faire marcher le mode interractif*/
  • END
  • INSERT INTO W_CMDFTP_TMP VALUES(N'send "'+@fileToSend+'"'); /*cmd FTP send OU mput si binary*/
  • INSERT INTO W_CMDFTP_TMP VALUES(N'bye'); /*ferme ftp*/
  • /* Requete d'écriture ligne à ligne */
  • SET @req = 'SELECT _ligne FROM '+db_name()+'..W_CMDFTP_TMP ORDER BY _cpt'
  • /* Création et remplissage du fichier de cmd tmp */
  • SET @cmd = 'BCP "' + @req + '" queryout "' + @path + @tmpCMDFTP + '" -c -CACP -U'+@loginBCP+' -P'+@passBCP+';'
  • IF @debug = 1
  • print @cmd
  • EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
  • IF @retShell != 0
  • BEGIN
  • SET @msgRet = 'Erreur bloquante sur la commande BCP : ' + @cmd
  • RETURN 1;
  • END
  • /* Ouvre le ftp en donnant le fichier de params créé ci-dessus */
  • /* Ce qui exécutera le "send" du fichier donné vers le répertoire FTP ouvert */
  • SET @retShellFTP = 0
  • DECLARE @OUT TABLE(_id int identity(1,1), _out varchar(1024))
  • SET @cmd = 'ftp -s:"' + @path + @tmpCMDFTP + '" ' + @serveurFTP
  • IF @debug = 1
  • print @cmd
  • INSERT INTO @OUT(_out)
  • EXEC @retShellFTP = xp_cmdshell @cmd
  • /* Essaye de renvoyer un message d'erreur cohérent */
  • IF @retShellFTP != 0
  • BEGIN
  • SET @msgRet = 'ERREUR INCONNUE: ' + @cmd
  • END
  • ELSE IF exists(SELECT 1 FROM @OUT WHERE _out like '%cannot log in%' or _out like '%Please login with%') or
  • not exists(SELECT 1 FROM @OUT WHERE _out is not null)
  • BEGIN
  • SET @retShellFTP = 99
  • SET @msgRet = 'ERREUR CONNEXION: ' + @cmd + char(13) + isnull((
  • SELECT top 1 replace(replace(_out,'','o'), 'Ú','e') FROM @OUT
  • WHERE isnull(_out,'') like '%cannot log in%' or isnull(_out,'') like '%Please login with%'),'?')
  • END
  • ELSE IF exists(SELECT 1 FROM @OUT WHERE _out like '%H_te inconnu%' or _out like '%Commande non valide%' or _out like '%Non connect_%')
  • BEGIN
  • SET @retShellFTP = 99
  • SET @msgRet = 'ERREUR SERVEUR: ' + @cmd + char(13) + isnull((
  • SELECT top 1 replace(replace(_out,'','o'), 'Ú','e') FROM @OUT
  • WHERE isnull(_out,'') like '%H_te inconnu%' or isnull(_out,'') like '%Commande non valide%' or isnull(_out,'') like '%Non connect_%'),'?')
  • END
  • /* Supprime le fichier de cmd FTP tmp */
  • SET @cmd = 'del "' + @path + @tmpCMDFTP + '"'
  • IF @debug = 1
  • print @cmd
  • EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
  • IF @retShell != 0
  • BEGIN
  • IF LEN(@msgRet)>0
  • SET @msgRet = @msgRet + char(13)
  • SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande DEL : ' + @cmd
  • END
  • /* Si demandé et aucune erreur, déplace ou supprime le fichier qui vient d'etre envoyé vers le ftp */
  • IF @retShellFTP = 0
  • BEGIN
  • IF len(ISNULL(@rep_fait,'')) > 0
  • BEGIN
  • IF RIGHT(@rep_fait,1) != '\'
  • SET @rep_fait = @rep_fait + '\'
  • IF @rep_fait like '[A-Z]:%\'
  • SET @cmd = 'MOVE /Y "' + @fileToSend + '" "' + @rep_fait + @file + '"'
  • ELSE
  • SET @cmd = 'MOVE /Y "' + @fileToSend + '" "' + @path + @rep_fait + @file + '"'
  • IF @debug = 1
  • print @cmd
  • EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
  • IF @retShell != 0
  • BEGIN
  • IF LEN(@msgRet)>0
  • SET @msgRet = @msgRet + char(13)
  • SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande MOVE : ' + @cmd
  • END
  • END
  • ELSE
  • BEGIN
  • SET @cmd = 'del "' + @fileToSend + '"'
  • IF @debug = 1
  • print @cmd
  • EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
  • IF @retShell != 0
  • BEGIN
  • IF LEN(@msgRet)>0
  • SET @msgRet = @msgRet + char(13)
  • SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande DEL : ' + @cmd
  • END
  • END
  • END
  • IF @debug = 1
  • print char(13) + @msgRet
  • RETURN @retShellFTP;
  • END
-- =============================================
-- Author:		Yannick Laussanne
-- Create date: 26/06/2012
-- Description:	Envoi d'un fichier existant sur le srv de BDD vers un FTP Unix ou Windows
--
--	On construit un fichier de commandes ftp temporaire et on exécute
--	la commande console ftp -s:"fichier_de_cmd" serveurFtp
--
--	Attention : si le param @rep_fait ne commence pas par [DISQUE]:\ on le concatène à @path
--	sinon on le prend tel quel
-- =============================================
CREATE PROCEDURE [dbo].[util_SendFTP]
	@serveurFTP nvarchar(300),		/*serveur FTP sans préfixe*/
	@loginFTP nvarchar(150),		/*login ftp*/
	@passFTP nvarchar(150),			/*pass ftp*/
	@workingDirFTP nvarchar(150),	/*doit-on se positionner sur un ou plusieurs sous répertoire du ftp*/
	@path varchar(255),				/*Répertoire physique de travail sur le srv de BDD*/
	@file varchar(255),				/*Fichier dans le "@path" à envoyer sur le ftp*/
	@rep_fait varchar(255),			/*Répertoire de move final pour les fichiers envoyés, si vide, supprime le fichier source*/
	@loginBCP varchar(50),			/*login de la connexion SQL pour BCP*/
	@passBCP varchar(50),			/*pass de la connexion SQL pour BCP*/
	@msgRet varchar(500) output,	/*Eventuellemnt, retourne un msg d'erreur*/
	@debug bit = 0					/*Affiche les commandes*/
AS
BEGIN
	SET NOCOUNT ON;

	SET @msgRet = 'OK'

	DECLARE 
		@cmd varchar(4000),
		@retShell int,
		@retShellFTP int,
		@req varchar(2500),
		@tmpCMDFTP varchar(100),		/* Fichier de cmd FTP temporaire */
		@fileToSend varchar(255)		/* path + file */	
	
	/* Normalement, les paramètres de chemin ont été validés par l'appelant */		
	IF RIGHT(@path,1) != '\'
		SET @path = @path + '\'
			
	/* Le fichier à envoyer */
	SET @fileToSend = @path + @file

	/* Le Fichier de cmd FTP temporaire */
	SET @tmpCMDFTP = 'tmpCMDFTP_' + replace(CONVERT(varchar,GETDATE(),114),':','') + '.txt'


	/* Crée et rempli le fichier de cmd FTP tmp en passant par une table de travail */
	DECLARE @tableTravail nvarchar(150) ; SET @tableTravail = db_name() + N'.dbo.W_CMDFTP_TMP'
	IF OBJECT_ID(@tableTravail, N'U') is null
		CREATE TABLE W_CMDFTP_TMP (
			_cpt int identity(1,1), 
			_ligne nvarchar(1024)
		);
	ELSE 
		TRUNCATE TABLE W_CMDFTP_TMP;	

	/* Construit les commandes selon le protocole ftp -s */
	INSERT INTO W_CMDFTP_TMP VALUES(@loginFTP);					/*login*/
	INSERT INTO W_CMDFTP_TMP VALUES(@passFTP);					/*pass*/
	IF ISNULL(@workingDirFTP,'') != ''							/*se place sur un sous-rep*/
		INSERT INTO W_CMDFTP_TMP VALUES('cd ' + @workingDirFTP);
	IF CHARINDEX('/', @loginFTP)>0								/*si login unix/EDI*/
	BEGIN							
		INSERT INTO W_CMDFTP_TMP VALUES('prompt');				/*obligatoire pour faire marcher le mode interractif*/
		INSERT INTO W_CMDFTP_TMP VALUES('prompt');				/*obligatoire pour faire marcher le mode interractif*/
	END
	INSERT INTO W_CMDFTP_TMP VALUES(N'send "'+@fileToSend+'"');	/*cmd FTP send OU mput si binary*/
	INSERT INTO W_CMDFTP_TMP VALUES(N'bye');					/*ferme ftp*/


	/* Requete d'écriture ligne à ligne */
	SET @req = 'SELECT _ligne FROM '+db_name()+'..W_CMDFTP_TMP ORDER BY _cpt'


	/* Création et remplissage du fichier de cmd tmp */
	SET @cmd = 'BCP "' + @req + '" queryout "' + @path + @tmpCMDFTP + '" -c -CACP -U'+@loginBCP+' -P'+@passBCP+';'
	IF @debug = 1
		print @cmd
	EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
	IF @retShell != 0
	BEGIN
		SET @msgRet = 'Erreur bloquante sur la commande BCP : ' + @cmd
		RETURN 1;
	END


	/* Ouvre le ftp en donnant le fichier de params créé ci-dessus */
	/* Ce qui exécutera le "send" du fichier donné vers le répertoire FTP ouvert */
	SET @retShellFTP = 0
	DECLARE @OUT TABLE(_id int identity(1,1), _out varchar(1024))

	SET @cmd = 'ftp -s:"' + @path + @tmpCMDFTP + '" ' + @serveurFTP
	IF @debug = 1
		print @cmd

	INSERT INTO @OUT(_out)
	EXEC @retShellFTP = xp_cmdshell @cmd




	/* Essaye de renvoyer un message d'erreur cohérent */
	IF @retShellFTP != 0
	BEGIN
		SET @msgRet = 'ERREUR INCONNUE: ' + @cmd
	END
	ELSE IF exists(SELECT 1 FROM @OUT WHERE _out like '%cannot log in%' or _out like '%Please login with%') or 
			not exists(SELECT 1 FROM @OUT WHERE _out is not null)
	BEGIN
		SET @retShellFTP = 99
		SET @msgRet = 'ERREUR CONNEXION: ' + @cmd + char(13) + isnull((
			SELECT top 1 replace(replace(_out,'¶','o'), 'Ú','e') FROM @OUT 
			WHERE isnull(_out,'') like '%cannot log in%' or isnull(_out,'') like '%Please login with%'),'?')
	END
	ELSE IF exists(SELECT 1 FROM @OUT WHERE _out like '%H_te inconnu%' or _out like '%Commande non valide%' or _out like '%Non connect_%')
	BEGIN
		SET @retShellFTP = 99
		SET @msgRet = 'ERREUR SERVEUR: ' + @cmd + char(13) + isnull((
			SELECT top 1 replace(replace(_out,'¶','o'), 'Ú','e') FROM @OUT 
			WHERE isnull(_out,'') like '%H_te inconnu%' or isnull(_out,'') like '%Commande non valide%' or isnull(_out,'') like '%Non connect_%'),'?')
	END


	/* Supprime le fichier de cmd FTP tmp */
	SET @cmd = 'del "' + @path + @tmpCMDFTP + '"'
	IF @debug = 1
		print @cmd
	EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT
	IF @retShell != 0
	BEGIN
		IF LEN(@msgRet)>0
			SET @msgRet = @msgRet + char(13)
		SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande DEL : ' + @cmd
	END


	/* Si demandé et aucune erreur, déplace ou supprime le fichier qui vient d'etre envoyé vers le ftp */
	IF @retShellFTP = 0
	BEGIN
		IF len(ISNULL(@rep_fait,'')) > 0
		BEGIN
			IF RIGHT(@rep_fait,1) != '\'
				SET @rep_fait = @rep_fait + '\'
		
			IF @rep_fait like '[A-Z]:%\'
				SET @cmd = 'MOVE /Y "' + @fileToSend + '" "' + @rep_fait + @file + '"'
			ELSE
				SET @cmd = 'MOVE /Y "' + @fileToSend + '" "' + @path + @rep_fait + @file + '"'
				
			IF @debug = 1
				print @cmd

			EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT	
			IF @retShell != 0
			BEGIN
				IF LEN(@msgRet)>0
					SET @msgRet = @msgRet + char(13)
				SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande MOVE : ' + @cmd
			END
		END
		ELSE
		BEGIN
			SET @cmd = 'del "' + @fileToSend + '"'
			IF @debug = 1
				print @cmd
			EXEC @retShell = xp_cmdshell @cmd, NO_OUTPUT	
			IF @retShell != 0
			BEGIN
				IF LEN(@msgRet)>0
					SET @msgRet = @msgRet + char(13)
				SET @msgRet = @msgRet + 'Erreur non bloquante sur la commande DEL : ' + @cmd
			END
		END	
	END
		
	IF @debug = 1
		print char(13) + @msgRet

	RETURN @retShellFTP;
END

 Conclusion

Exemple d'appel :

DECLARE
@msgOut varchar(500),
@retProc int

EXEC @retProc = util_SendFTP
@serveurFTP = '10.46.XXX.XXX',
@loginFTP = 'leLogin',
@passFTP = 'lePassword',
@workingDirFTP = 'myDirectoryFTP/mySubDirectoryFTP',
@path = 'C:\TestSendFTP\',
@file = 'toto.txt',
@rep_fait = 'C:\TestSendFTP\FAIT\',
@loginBCP = 'sa',
@passBCP = 'sql',
@msgRet = @msgOut output,
@debug = 0

print '@retProc = ' + cast(@retProc as varchar)
print '@msgOut = ' + @msgOut


 Historique

05 septembre 2012 13:12:28 :
Ajout d'un bloc de gestion d'erreur plus efficace (test des différents cas d'erreur en plus du rejet de connexion) Le bloc commence à partir de : /* Essaye de renvoyer un message d'erreur cohérent */ IF @retShellFTP != 0 BEGIN (...) END

 Sources du même auteur

SQL-SERVER : PROC.GESTION XML AVEC XPATH

 Sources de la même categorie

SQL-SERVER : PROC.GESTION XML AVEC XPATH par yann_lo_san
IMPORTATION DE FICHIER TEXT (CSV) RAPIDEMENT par vladam
Source avec une capture T-SQL - SPLIT SANS TABLE TEMPORAIRE par TheOnlyMaX
Source avec Zip (SQL SERVER) REQUÊTE POUR RECHERCHER UN {GUID} DANS TOUS LES... par lassaad83
[ORACLE]DÉTERMINER LA DATE DU PREMIER JOUR D'UNE SEMAINE PAR... par Bouillou2

 Sources en rapport avec celle ci

SQL SERVER - PROCÉDURE STOCKÉE FAISANT UN BACKUP DE TOUTES L... par fabrice69
SQL SERVER - PROCÉDURE STOCKÉE METTANT À JOUR TOUTES LES STA... par fabrice69
SQL SERVER - REQUETTE POUR OBTENIR LES INFORMATIONS D'UNE PR... par fabrice69
SQL SERVER - OBTENIR LA LISTE DES PROCÉDURES STOCKÉES D'UNE ... par fabrice69
PROCEDURE STOCKEE SOUS SQLSERVER par vladam

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

création d'une automatique d'une base de données SQLServer [ par MokhTelnet ] bonjourj'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application.mon client ne veux se charge Commande DOS pour SQLServer 7 [ par MokhTelnet ] y a t'il une commande dos pour SQLSERVER 7 ?(comme la commande sqlplus pour oracle) création automatique d'une base de données SQLServer [ par MokhTelnet ] bonjour j'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application. mon client ne veux se char Procedure exportant une table en excel [ par karn ] Bonjour,est 'il avec possible avec une procedure stocker d'exporter une table au format excel? faire une somme sur le resultat d'une procedure stockée [ par lijohann ] salut, mon probleme est que je voudrais pouvoir recupérer la somme d'un des champs renvoyés par une procedure stockée dans une autre procedure stockée Récuperer les noms, types, etc... d'un parametre d'une procedure stockée [ par Arthenius ] Hello tout le monde,Sous SQL serveur et/ou Mysql je souhaiterais pouvoir récupérer les paramêtres d'une procédure stockées.Grosso modo je veux pouvoir Problème SQLSERVER/php [ par LeJulius ] Je travaille actuellement sous SQL SERVER 2000 en lien avec du PHP 4.2.0 Mon problème est le suivant :Mes tables sql contiennent des caractères accent Faire plusieurs if dans un procedure stockee [ par chris81 ] bonjour,comment puis je faire pour verifier plusiseurs if dans la meme procedure stockee c'est a direif not exist(SELECT Id FROM...) et if not exists( appel a une procedure stockee [ par choupi64 ] salut,Je precise le cadre du developpement: Access moteur MSDE ->ADOBref, j'ai une procedure stockée qui marche bien et je voudrais dans mon c Erreur 446 [ par fdouieb ] Bonjour, Voici ma config: Win XP SP2 avec SQL Serveur 2000 j'ai un problem sur une procedure stocke. Voici la procedure. create procedure Test as b


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,917 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales