У меня есть таблица отношений «многие ко многим» 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)
сам по себе, он работает нормально. Затем мой тест может продолжиться и вставить оставшиеся строки без ошибок.