Сообщение 8672, уровень 16, состояние 1, строка 1 Оператор MERGE пытался ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза - PullRequest
5 голосов
/ 09 июня 2011

Я пытаюсь выполнить обновление / вставку ... я получаю сообщение об ошибке: (сообщение 8672, уровень 16, состояние 1, строка 1 Инструкция MERGE пыталась ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза. Это происходит, когда целевая строка соответствует более чем одной исходной строке. Оператор MERGE не может ОБНОВИТЬ / УДАЛИТЬ одну и ту же строку целевой таблицы несколько раз. Уточните предложение ON, чтобы обеспечить соответствие целевой строки максимум одной исходной строке, или используйте предложение GROUP BY для группировки исходных строк. )

Merge into Rows as R
USING (select RowNo,DOB,Pin,State,RowType,RowStatus from Temp_info) as tmp
ON R.Rownumber=tmp.Rowno
WHEN MATCHED THEN 
UPDATE 
    SET R.DOB=tmp.DOB,
    R.Pin=tmp.Pin,
    R.State=tmp.State,
    R.RowType=tmp.RowType,
    R.RowStatus=tmp.RowStatus,
    R.deleted='N',
    R.last_modified=getdate()
WHEN NOT MATCHED THEN 
INSERT (RowNumber,DOB,Pin,State,RowType,RowStatus,deleted,last_modified)
values (tmp.RowNo,tmp.DOB,tmp.Pin,tmp.State,tmp.RowType,tmp.RowStatus,'N',GETDATE());

1 Ответ

4 голосов
/ 09 июня 2011

Это происходит, когда целевая строка соответствует более чем одной исходной строке.
Оператор MERGE не может ОБНОВИТЬ / УДАЛИТЬ одну и ту же строку целевой таблицы несколько раз.

Ошибка довольно очевидна,Я думаю.

У вас есть дубликаты строк в исходной таблице.Таким образом, для одной строки с таблицей Rownumber = X в Rows существует более одной строки с таблицей Rowno = X в таблице Temp_info.

SQL-сервер хотел бы узнать, какая строка из этих повторяющихся строк в источникетаблица для обновления для одной строки в целевой таблице.

[Изменить]

В ответ на ваш ответ: один из вариантов заключается в дублировании дозапустив слияние:

with cte
as
(
    select row_number() over(partition by RowNo order by DOB desc) RowNumber
    from Temp_info
)
delete cte
where RowNumber > 1

Я использовал DOB в качестве поля, которое определяет порядок, чтобы знать, что является последним.Замените это поле тем, которое вы хотите использовать для заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...