Accueil > > > SQL-SERVER PROC. SEND_FTP
SQL-SERVER PROC. SEND_FTP
Information sur la source
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 de la même categorie
Commentaires et avis
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
BESOIN D'AIDE BESOIN D'AIDE par dzservers
Cliquez pour lire la suite par dzservers
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|