Farei prima l'AGGIORNAMENTO altrimenti aggiornerai le righe che hai appena inserito
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
Considererei anche la possibilità di modificare l'XML in una tabella temporanea e utilizzare SQLBulkCopy. Abbiamo riscontrato che questo è più efficiente dell'analisi XML in generale per più di poche centinaia di righe. Se non puoi cambiarlo, distruggi prima l'XML in una tabella temporanea?