Сложное слияние TSQL

У меня есть ' унаследованный ' блестящий фрагмент кода TSQL, который делает следующее:

  • Циклы построчно -наведите курсор на курсор.
  • Курсор содержит данные, которые необходимо объединить (загрузить) в таблице 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

Также пробовал различные подходы, такие как вложенный выбор, который отправляет IDB на ВЫХОДЕ , но это не удается, потому что 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

Кто-нибудь знает об этом? По сути, я думаю, что если мы обобщим, вопрос будет следующим:

Могу ли я вставить и вернуть PK в один оператор, который может быть вложен в другие операторы

Заранее спасибо за любые ответы

Джордж

5
задан Martin Smith 21 September 2011 в 13:51
поделиться