Jag skulle göra UPPDATERING först, annars uppdaterar du raderna du just har infogat
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
Jag skulle också överväga att ändra XML till en temporär tabell och använda SQLBulkCopy. Vi har tyckt att detta är mer effektivt än att analysera XML i allmänhet för mer än några hundra rader. Om du inte kan ändra detta, strimlar du då XML till en temporär tabell först?