[SQL Server] Zipper des fichiers XML
-- =============================================
-- Author: KHARROUBI Zouhaier
-- Create date: 24/10/2013
-- Description: Compresser le(s) fichier(s)
-- Exemple : EXEC [dbo].[usp_CompressFile] N'c:\result\zip_test.zip', N'C:\result\MK94030002.XML'
-- EXEC [dbo].[usp_CompressFile] N'D:\commandes\mektaba_commandes\mektaba_commandes.zip', N'D:\commandes\mektaba_commandes\'
-- =============================================
CREATE PROCEDURE [dbo].[usp_CompressFile]
@ZipFile VARCHAR(255),
@FileToZip VARCHAR(255)
AS
DECLARE @hr INT,
@folderObject INT,
@shellObject INT,
@src VARCHAR(255),
@desc VARCHAR(255),
@command VARCHAR(255),
@password VARCHAR(255),
@username VARCHAR(255)
-- SET @username = 'user_name'
-- SET @password = 'password'
-- Créer le répertoire de destination de copie
BEGIN TRY
EXEC Master..xp_cmdshell'MD D:\commandes'
EXEC Master..xp_cmdshell'MD D:\commandes\mektaba_commandes'
--Supprimer les fichiers xml
EXEC Master..xp_cmdshell'DEL D:\commandes\mektaba_commandes\*.xml /S /Q'
--Supprimer les fichiers zip
EXEC Master..xp_cmdshell'DEL D:\commandes\mektaba_commandes\*.zip /S /Q'
--Copier les commandes dans le répertoire de travail
EXEC Master..xp_cmdshell'COPY \\mektabaftp\mektaba_commandes\*.xml D:\commandes\mektaba_commandes\*.*'
--Creation table temporaire pour sauvegarder les textes des fichiers à zipper
CREATE TABLE ##DummyTable( [DummyColumn] [VARCHAR](255))
--En-tête du fichier à zipper
DECLARE @zipHeader VARCHAR(22)
SET @zipHeader = CHAR(80) + CHAR(75) + CHAR(5) + CHAR(6) + REPLICATE(CHAR(0),18)
--Insertion de l'en-tête du fichier à zipper
INSERT INTO ##DummyTable(DummyColumn) VALUES (@zipHeader)
--creer/sauvegarder le fichier zip cible
-- SET @command = 'bcp "..##DummyTable" out "' + @ZipFile + '" -c -U "' + @username + '" -P "' + @password + '"'
-- SET @command = 'bcp "..##DummyTable" out "' + @ZipFile + '" -c -T'
SET @command = 'bcp "..##DummyTable" out "' + @ZipFile + '" -x -T'
EXEC MASTER..xp_cmdshell@command
--supprimer la table temporaire
DROP TABLE ##DummyTable
--créer l'objet shell
EXEC @hr = sp_OACreate'Shell.Application',@shellObject OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo@shellObject , @src OUT , @desc OUT
SELECT hr = convert(VARBINARY(4),@hr),
Source = @src,
DESCRIPTION = @desc
RETURN
END
--créer le répertoire zip
SET @command = 'NameSpace("' + @ZipFile + '")'
EXEC @hr = sp_OAMethod@shellObject , @command , @folderObject OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo@shellObject , @src OUT , @desc OUT
SELECT hr = convert(VARBINARY(4),@hr),
Source = @src,
DESCRIPTION = @desc
RETURN
END
--copier les fichiers vers le répertoire zip
SET @command = 'CopyHere("' + @FileToZip + '")'
EXEC @hr = sp_OAMethod@folderObject , @command
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo@folderObject , @src OUT , @desc OUT
SELECT hr = convert(VARBINARY(4),@hr),
Source = @src,
DESCRIPTION = @desc
RETURN
END
--Supprimer les objets utilisés.
EXEC sp_OADestroy@shellObject
EXEC sp_OADestroy@folderObject
END TRY
BEGIN CATCH
IF @@ERROR<>0
BEGIN
--Supprimer les objets utilisés.
EXEC sp_OADestroy@shellObject
EXEC sp_OADestroy@folderObject
END
END CATCH