У меня есть унаследованный 'блестящий кусок кода TSQL, который делает это:
- Перемещает строку за строкой над курсором.
- Курсор содержит данные, которые необходимо объединить (Upserted) в таблице A
- Для каждого цикла строки в курсоре вызывается сохраненный процесс. Процесс:
- Если соответствующая строка существует в таблице A, то она обновляется
- Если такой строки не существует, то:
- Вставляет одну строку в другую таблицу B.
- Извлекает вновь сгенерированный идентификатор (скажем, его называют IDB)
- Вставляет одну строку в таблицу A. Вставки таблицы A требуется IDB (поле не является нулевым, предполагается, что оно имеет значения ТОЛЬКО из таблицы 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
Заранее спасибо за любые ответы
George