Assets
我有一个包含两列的 SQL Server 2008 多对多关系表 ( ):
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)
人时,它工作正常。然后我的测试能够继续并插入没有错误的剩余行。