Primero haría la ACTUALIZACIÓN; de lo contrario, actualizará las filas que acaba de insertar
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
También consideraría cambiar el XML a una tabla temporal y usar SQLBulkCopy. Descubrimos que esto es más eficiente que analizar XML generalmente para más de unos pocos cientos de filas. Si no puede cambiar esto, ¿destruye primero el XML en una tabla temporal?