Je ferais d'abord la mise à jour, sinon vous mettrez à jour les lignes que vous venez d'insérer
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
J'envisagerais également de changer le XML en une table temporaire et d'utiliser SQLBulkCopy. Nous avons trouvé cela plus efficace que l'analyse XML généralement pour plus de quelques centaines de lignes. Si vous ne pouvez pas changer cela, décomposez-vous d'abord le XML dans une table temporaire ?