[SQL Server] Transformer les colonnes du fichier Excel en valeurs et afficher devant chaque colonne transformée sa valeur affectée dans le fichier Excel

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

-- Author:        Zouhaier KHARROUBI

-- Create date:   08/12/2016

-- Description:   Transformer les colonnes du fichier Excel en valeurs et afficher devant chaque colonne transformée sa valeur affectée dans le fichier Excel

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

--Contenu fichier Excel :

 

Matricule

Nom

Prenom

Poste

M100

KHARROUBI

Zouhaier

DBA

M101

DU PONT

Jean

Comptable

M102

JARDINIER

François

Commercial

 

 

 

 

--Le resultat de la requête :

 

Matricule

Designation_Champ

Valeur_Champ

Fichier_Source

M100

Nom

KHARROUBI

employes.xlsx

M100

Prenom

Zouhaier

employes.xlsx

M100

Poste

DBA

employes.xlsx

M101

Nom

DU PONT

employes.xlsx

M101

Prenom

Jean

employes.xlsx

M101

Poste

Comptable

employes.xlsx

M102

Nom

JARDINIER

employes.xlsx

M102

Prenom

François

employes.xlsx

M102

Poste

Commercial

employes.xlsx

 

 

 

 

 

 

 

 

 

 

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'tempdb..#Colonnes'))

      BEGIN

            DROP TABLE #Colonnes

      END

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'tempdb..EMPLOYE_Temp'))

            BEGIN

                  DROP TABLE tempdb..EMPLOYE_Temp

            END

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'tempdb..EMPLOYE'))

            BEGIN

                  DROP TABLE tempdb..EMPLOYE

            END

CREATE TABLE tempdb..EMPLOYE

(

      Matricule                   CHAR(10)

      ,Designation_Champ           VARCHAR(35)

      ,Valeur_Champ                VARCHAR(50)

      ,Fichier_Source              NVARCHAR(250)

)          

CREATE TABLE #Colonnes

(

      Num_Col INT IDENTITY(1,1)

      ,Nom_Col VARCHAR(150)

)

Declare @Num_Col            INT

            ,@Nbre_Col              INT

            ,@Nom_Col               VARCHAR(150)

            ,@Requete               NVARCHAR(MAX)

            ,@Fichier_Source  NVARCHAR(250)

SELECT @Fichier_Source ='employes.xlsx'

SELECT * INTO tempdb..EMPLOYE_Temp FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml; HDR=YES; IMEX=1; Database=c:\employes.xlsx',[Feuil1$]) WHERE ISNULL([Matricule],'')<>''

INSERT INTO #Colonnes(Nom_Col)

SELECT T2.name FROM tempdb.sys.objects T1

JOIN tempdb.sys.columns T2 ON T2.object_id=T1.object_id

WHERE T1.name LIKE 'EMPLOYE_Temp%' AND T2.name<>'Matricule'

ORDER BY T2.column_id

SELECT @Nbre_Col = COUNT(*) FROM #Colonnes

SELECT @Num_Col = 1

           

WHILE @Num_Col <= @Nbre_Col

      BEGIN

            SELECT @Nom_Col = Nom_Col FROM #Colonnes WHERE Num_Col=@Num_Col

           

            SELECT @Requete = 'INSERT INTO tempdb..EMPLOYE (Matricule,Designation_Champ,Valeur_Champ,Fichier_Source)'

            SELECT @Requete = @Requete + ' SELECT DISTINCT [Matricule],''' + CAST(@Nom_Col AS VARCHAR(MAX)) + ''',[' + CAST(@Nom_Col AS VARCHAR(MAX)) + '],''' + @Fichier_Source + ''' FROM tempdb..EMPLOYE_Temp WHERE ISNULL([' +CAST(@Nom_Col AS VARCHAR(MAX)) + '],'''')<>'''''

            EXECUTE sp_executesql@Requete

     

            SELECT @Num_Col = @Num_Col + 1

      END

SELECT * FROM tempdb..EMPLOYE ORDER BY Matricule