août
2011
Juste un petit topo pour mettre à jour (MAJ) une table à partir des données d’une autre table.
/!\Attention : les tables concernées doivent avoir la même collation
/* ==================================================================================
– Description : Mettre jour une table partir des données d'une autre table
– Auteur : Etienne ZINZINDOHOUE
– SQL SERVER 2005/2008R2
==================================================================================*/
CREATE TABLE T1(id int, c1 char(1))
GO
CREATE TABLE T2(id int, c1 char(1))
GO
–jeu de données
INSERT INTO T1
SELECT 1,'a'
UNION
SELECT 2,'b'
UNION
SELECT 3,'c'
GO
INSERT INTO T2
SELECT 1,'1'
UNION
SELECT 2,'2'
GO
–Mettre à jour T1(c1) en fonction de T2(c1)
– Résultat attendu après la MAJ
T1
————
id c1
— —
1 1
2 2
3 c
–La requête de MAJ
–>> Update simple
UPDATE T1
SET T1.c1= T2.c1
FROM T2 INNER JOIN T1 ON T2.id = T1.id
GO
–Vérification de la MAJ
SELECT * FROM T1
–>>Autre Méthode, utilisation du CTE (Common Table Expressions ), introduit depuis SQL 2005
————————————–– Méthode avec un CTE
————————————–
WITH cte AS (SELECT id,c1 FROM T1)
UPDATE cte
SET cte.c1 = T2.c1
FROM cte INNER JOIN T2 ON T2.id = cte.id
GO
–Véfication de la MAJ
SELECT * FROM T1
–>> Le top du top c’est l’utilisation de MERGE introduit depuis SQL SERVER 2008. Comment ça marche ?
———————————–
– Utilisation de MERGE
———————————–
MERGE T1 – Table cible (TARGET)
USING T2 – Table source (SOURCE)
ON T1.id = T2.id
WHEN MATCHED THEN
UPDATE SET
T1.c1 = T2.c1;
GO
–Vérification
SELECT * from T1
–Update + Insert (Insert si la ligne existe dans T2 mais pas dans T1)
GO
MERGE T1 – Table cible (TARGET)
USING T2 – Table source (SOURCE)
ON T1.id = T2.id
WHEN MATCHED THEN
UPDATE SET T1.c1 = T2.c1
WHEN NOT MATCHED BY TARGET THEN – si l'id existe dans T2 mais pas dans T1 alors insérer cette nouvelle ligne dans T1
INSERT (T1.id,T1.c1)
VALUES (T2.id,T2.c1);
– Avec les options MATCHED et NOT MATCHED on peut réaliser plusieurs opérations en une seule fois : Update/Insert/Delete
–> Simuler la commande MERGE sous SQL SERVER 2005
– Table temporaire pour stocker l'ID des nouveaux contacts
CREATE TABLE #updated_GUID (objectGUID nvarchar(100))
–Mis à jour des contacts à partir de la table cible TMP_Contacts
UPDATE Contacts
SET
FirstName = t.FirstName
,Initials = t.Initials
,LastName = t.LastName
,Company = t.Company
,BusinessPhone = t.BusinessPhone
,EmailAddress = t.EmailAddress
–Recupérer l’ID des contacts mis à jours
OUTPUT inserted.objectGUID INTO #updated_GUID
FROM Contacts c, TMP_Contact t
WHERE c.objectGUID = t.objectGUID
–Insertion des nouveaux contacts
INSERT INTO Contacts(
FirstName
,Initials
,LastName
,Company
,BusinessPhone
,EmailAddress)
SELECT
FirstName
,Initials
,LastName
,Company
,BusinessPhone
,EmailAddress
FROM TMP_Contacts t
WHERE t.objectGUID NOT IN(SELECT objectGUID FROM #updated_GUID)
–Supprimer la table temporaire
DROP TABLE #updated_GUID
———————————————————–
Etienne ZINZINDOHOUE
———————————————————–
Bonjour Nicolas,
Merci pour la remarque. Il s’agit bien de SQL Server 2008. Je profite pour corriger ce sous-titre.
Thx
Bonjour Étienne,
Il me semble que MERGE a été introduite avec SQL Server 2008 (« ->> Le top du top c’est l’utilisation de MERGE introduit depuis SQL SERVER 2005″)
@++