Nejprve bych provedl UPDATE, jinak aktualizujete řádky, které jste právě vložili
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
Také bych zvážil změnu XML na dočasnou tabulku a použití SQLBulkCopy. Zjistili jsme, že je to efektivnější než analýza XML obecně pro více než několik set řádků. Pokud to nemůžete změnit, skartujete nejprve XML do dočasné tabulky?