私は基本的にUPSERTを行うためにMERGEステートメントを使用しています。宛先に存在しない行については、それらを特定の順序で挿入したいと思います。残念ながら、ORDER BY句はマージ・ステートメントではサポートされていないようです。ある声明でこれを行う方法はありますか?私がやろうとしています何の良いアイデアのための例を参照してください:SQL Server 2008 MERGEステートメントに不一致行が挿入される順序を指定できますか?
CREATE TABLE #destination (ident int not null identity(1,1), id int not null, value int not null)
INSERT INTO #destination (id,value) VALUES (1,50)
CREATE TABLE #source (id int not null, value int not null)
INSERT INTO #source (id,value) VALUES (1,100),(3,300),(2,200)
MERGE #destination d
USING #source s
ON d.id = s.id
WHEN MATCHED THEN
UPDATE
SET d.value = s.value
WHEN NOT MATCHED THEN
INSERT (id,value)
VALUES (s.id,s.value);
SELECT * FROM #destination ORDER BY ident
/*
WILL LIKELY SEE:
1, 1, 100
2, 3, 300
3, 2, 200
WANT TO ACHIEVE:
1, 1, 100
2, 2, 200
3, 3, 300
*/
私はこれをしたい理由は、私はこのマージを行い、自分のコードのためのユニットテストを書いて、決定論的に挿入をしたいしたいです注文。私はこれを回避する方法があることを知っていますが、MERGEの挿入を注文する方法があれば、最も簡単です。
あなたの見積もりは、行の順序がないことをかなり明確にしていますが、操作については不思議です。少なくとも2つの例では、更新は挿入前に行われます。したがって、操作が同じ順序で実行されている可能性がありますか?削除、更新、そして挿入?これに影響を与える方法はありますか? –