私はこれを行う素晴らしいTSQLコードを「継承」しました。
- カーソル上で行ごとにループします。
- カーソルには、表Aでマージ(アップサート)する必要のあるデータが含まれています
- カーソルの行ループごとに、ストアドプロシージャが呼び出されます。手順:
- 対応する行がテーブルAに存在する場合、それは更新されます
- そのような行が存在しない場合は、次のようにします。
- 別のテーブルBに単一の行を挿入します。
- 新しく生成されたIDをフェッチします(たとえば、IDBと呼ばれます)
- テーブルAに単一の行を挿入します。テーブルAの挿入にはIDBが必要です(フィールドはnullではなく、テーブルBからの値のみを持つことになっていますが、FK制約はありません)
明らかにこれは最悪です(パフォーマンスとエレガンスの理由)!!
質問 最初は、これはMERGEの使用の標準的なケースのように見えます。私はやってみました:
MERGE [dbo].[TableA] AS Target
USING <cursor data set as a select statement> as Src on target.IDA = Src.IDA
WHEN MATCHED
//update
WHEN NOT MATCHED
//insert <------ Fails because obviously a new IDB is required
また、のようなさまざまなアプローチを試しましたnested select that sends IDB on the OUTPUT
が、IDBがPKであるため失敗します。
他の種類のマージも失敗しました。例:
MERGE Table A with <cursor data set as a select statement>
...
MERGE Table A with Table B
WHEN NOT MATCHED
//insert on Table A
WHEN NOT MATCHED
// Update Table B
誰かがこれについて考えを持っていますか?基本的に、質問を一般化すると、次のようになると思います。
Can I insert and return the PK in one statement that can be nested in other statements
返信をよろしくお願いします
ジョージ