[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