Najpierw wykonałbym UPDATE, w przeciwnym razie zaktualizujesz wiersze, które właśnie wstawiłeś
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
Rozważyłbym również zmianę XML na tabelę tymczasową i użycie SQLBulkCopy. Odkryliśmy, że jest to bardziej wydajne niż analizowanie XML ogólnie dla więcej niż kilkuset wierszy. Jeśli nie możesz tego zmienić, czy najpierw niszczysz XML do tabeli tymczasowej?