Я «унаследовал» отличный кусок кода TSQL, который делает следующее:
- Построчно перемещается по курсору.
- Курсор содержит данные, которые необходимо объединить (обновить) в таблице A
- For each row loop in the cursor a stored proc is called. The proc:
- If a corresponding row exists in Table A then it is updated
- If such a row does not exist then:
- Inserts a single row in in a different Table 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 - это ПК.
Другие виды слияний также потерпели неудачу, например:
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
Заранее благодарим за любые ответы
Георгий