[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