[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