[SQL Server] Interroger un fichier Excel via procédure stockée dynamique

-- =============================================

-- Author:        Zouhaier KHARROUBI

-- Create date: 28/04/2016

-- Description:   Interroger un fichier Excel via Transact Sql

-- Exemple d'exécution :

-- EXEC     [dbo].[usp_FichierExcel_Select]

--          @Chemin_Fichier = N''C:\MEKTABA\mektaba.xlsx'',

--          @Nom_Classeur = N'[mektaba_1$]',

--          @Type_Requete = 1

-- NB : Il faut installer le driver Microsoft.ACE.OLEDB.12.0 32 bits

--  et 64 bits sur un serveur 64 bits autrement les commandes OPENQUERY et/ou OPENROWSET ne peuvent pas fonctionner

-- =============================================

CREATE PROCEDURE [dbo].[usp_FichierExcel_Select]

      -- Add the parameters for the stored procedure here

      @Chemin_Fichier AS NVARCHAR(MAX)

      ,@Nom_Classeur   AS NVARCHAR(250)

      ,@Type_Requete    AS TINYINT       = 1

AS

BEGIN

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

     

      DECLARE @Requete       AS NVARCHAR(MAX)

   -- Insert statements for procedure here

     

IF @Nom_Classeur NOT LIKE '[[]%'

      BEGIN

            SELECT @Nom_Classeur = '[' + @Nom_Classeur

      END

   IF @Nom_Classeur NOT LIKE '%[$]]'

      BEGIN

            SELECT @Nom_Classeur = @Nom_Classeur + '$]'

      END

      IF @Type_Requete =1

            BEGIN

                  IF EXISTS(SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'ExcelLinkSrv2')

                        BEGIN

                             EXEC master.dbo.sp_dropserver@server=N'ExcelLinkSrv2', @droplogins='droplogins'

                        END

                  EXEC sp_addlinkedserver

                  @server = 'ExcelLinkSrv2',

                  @srvproduct = 'Excel',

                  @provider = 'Microsoft.ACE.OLEDB.12.0',

                  @datasrc = @Chemin_Fichier,

                  @provstr = 'EXCEL 12.0 XML;HDR=YES';    

                  SELECT @Requete = 'SELECT * FROM OPENQUERY(ExcelLinkSrv2, ''select * from ' + @Nom_Classeur + ''')'

                  EXEC (@Requete)        

            END

      ELSE

            BEGIN

                  SELECT @Requete = 'SELECT * FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0 Xml; HDR=YES; IMEX=1; Database=' + @Chemin_Fichier + ''',' + @Nom_Classeur + ')'

                  EXEC (@Requete) 

 

SELECT @Requete ='SELECT * FROM OPENROWSET(''MSDASQL'',

                         ''DRIVER=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb);

                         UID=admin;

                         UserCommitSync=Yes;

                        Threads=3;

                         SafeTransactions=0;

                         ReadOnly=1;

                         PageTimeout=5;

                         MaxScanRows=8;

                         MaxBufferSize=2048;

                          FIL=excel 12.0;

                         DriverId=1046;

                         DefaultDir=C:\Mes_Documents;

                         DBQ=C:\Mes_Documents\MonFichier.xlsx'',

                         ''SELECT * FROM [Feuil1$]'')'

                        EXEC (@Requete)

            END

END