最初に UPDATE を実行します。そうしないと、挿入したばかりの行が更新されます
SELECT .. INTO #temp FROM (shredXML)
BEGIN TRAN
UPDATE ... FROM WHERE (matches using #temp)
INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS
COMMIT
また、XML を一時テーブルに変更し、SQLBulkCopy を使用することも検討します。これは、一般的に数百行を超える XML を解析するよりも効率的であることがわかりました。これを変更できない場合は、最初に XML を一時テーブルに分割しますか?