2010-01-19 7 views
4

Je suis à la recherche d'une solution pour effectuer l'insertion, sur clé en double mise à jour comme opération dans SQL Server 2005. Cette opération peut insérer ou mettre à jour un grand nombre d'entrées. SQL Server 2008 a une opération MERGE qui ferait parfaitement, le problème est que nous sommes coincés avec SQL Server 2005.
J'ai examiné des solutions standard, mais tous ne sont pas bons, car ils supposent que seul une entrée est mise à jour/insérée.
Est-ce que quelqu'un connaît un moyen de répliquer le comportement MERGE dans les anciennes versions de SQL Server?SQL Server 2005, en vrac UPDATE ou INSERT

+0

Qu'est-ce que SQL Server * 2003 *? – Heinzi

+0

Mon mauvais, je voulais dire la version 2005 –

Répondre

6

Alex Kuznetsov's blog contient une suggestion utilisant la clause OUTPUT d'une instruction UPDATE. Pour paraphraser l'exemple de cette entrée de blog (non testé):

DECLARE @updated_ids table(id int) 

UPDATE table 
    SET ... 
OUTPUT inserted.id INTO @updated_ids 
    FROM table INNER JOIN data-to-insert ON table.id = data-to-insert.id 

INSERT INTO table 
SELECT ... 
    FROM data-to-insert 
WHERE id NOT IN (SELECT id FROM @updated_ids) 
+0

Je dois commencer à utiliser la clause OUTPUT plus! –

+2

Une note sur les performances, si vous ajoutez une clé primaire à la variable de table, il accélère considérablement l'exécution. Pour moi, cela a réduit le temps d'exécution d'une insertion/mise à jour de 100k lignes de 4 minutes à ~ 6 secondes. 'déclarer la table @updated_ids (id int PRIMARY KEY CLUSTERED)' – Tr1stan