次の制約を使用して挿入または更新を実行することは可能ですか?
- Dapperはプロジェクトで使用されています
- 主キーは正の自動インクリメントです
- 新しく挿入されたデータにはPK 値がない
0
(または の値がある)可能性があります - データには、新しく挿入された行の PK 値が必要です。
- クエリは手続き的に生成されており、一般化することが望ましい
何かのようなもの :
int newId = db.QueryValue<int>( <<insert or update>>, someData );
私はさまざまな解決策について読んだことがありますが、最良の解決策は次のようです。
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
しかし
- 3番目の制約で失敗したようで、
- 新しく生成された ID を返すことは保証されません。
5 番目の制約 (または好み) のために、ストアド プロシージャは過度に複雑に見えます。
可能な解決策は何ですか?ありがとう!