MERGE Нарушение ограничения PRIMARY KEY

У меня есть таблица отношений «многие ко многим» SQL Server 2008 (Assets) с двумя столбцами :

AssetId (PK, FK, uniqueidentifier, not null)
AssetCategoryId (PK, FK, int, not null)

В моем проекте мне нужно брать строки из этой таблицы и периодически вставлять их в реплицируемую базу данных. Итак, у меня есть две абсолютно одинаковые базы данных (включая ограничения).

Для «копирования» из одной базы данных в другую я использую оператор MERGE с временной таблицей. Я вставляю до 50 записей во временную таблицу, затем объединяю временную таблицу с таблицей Assets, в которую я копирую, следующим образом:

CREATE TABLE #Assets (AssetId UniqueIdentifier, AssetCategoryId Int);
INSERT INTO #Assets (AssetId, AssetCategoryId) VALUES ('ed05bac3-7a92-46aa-8822-2d882b137597', 44), ('dc5e3082-e2eb-4bdf-a640-94e0f59411ed', 22) ... ;

MERGE INTO Assets WITH (HOLDLOCK) AS Target 
USING #Assets AS Source 
ON Target.AssetId = Source.AssetId AND Target.AssetCategoryId = Source.AssetCategoryId 
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED BY Target THEN 
INSERT (AssetId,AssetCategoryId) VALUES (Source.AssetId,Source.AssetCategoryId);

По большей части это прекрасно работает. Однако время от времени я получаю сообщение об ошибке:

Нарушение ограничения PRIMARY KEY «PK_Assets». Невозможно вставить дубликат ключа в объекте 'dbo.Assets'. Повторяющееся значение ключа (dc5e3082-e2eb-4bdf-a640-94e0f59411ed, 22). Заявление было прекращено.

Когда я проверяю таблицу Assets, такой записи не существует... поэтому я не понимаю, как вставить дубликат ключа.

Есть идеи, что здесь происходит?

ОБНОВЛЕНИЕ

При тестировании успешно запускается 6 раз, вставляя 300 строк. С 7-й попытки всегда выдает ту же ошибку, что и выше. Кроме того, когда я INSERT(dc5e3082-e2eb-4bdf-a640-94e0f59411ed, 22)сам по себе, он работает нормально. Затем мой тест может продолжиться и вставить оставшиеся строки без ошибок.

7
задан Justin 23 May 2012 в 18:09
поделиться