SQL 服务器中的重复项不会被忽略

Duplicates not getting ignored in SQL Server

我有一个有两行的临时 table。 他们的ID是999359143, 999365081

我有一个 table,它没有主键,但有一个基于 ID 和日期的唯一索引。

这个999359143已经存在于table中。因此,当我使用我的查询时,它仍然试图将 temp table 中的行插入到正常的 table 中,但它出错了。这是下面的查询

INSERT INTO [XferTable]
           ([DataDate]
           ,[LoanNum]
          )

SELECT Distinct t1.[DataDate]
           ,t1.[LoanNum]               
FROM #AllXfers t1 WITH(HOLDLOCK) 
WHERE NOT EXISTS(SELECT t2.LoanNum, t2.DataDate
                    FROM XferTable t2 WITH(HOLDLOCK) 
                   WHERE t2.LoanNum = t1.LoanNum AND t2.DataDate = t1.DataDate
)

有更好的方法吗?

您应该在临时表上使用 MERGE statement, which acts atomically so you shouldn't need to do your own locking (also, isolation query hints 没有任何作用。

MERGE XferTable AS SOURCE
USING #AllXfers AS TARGET
ON
    SOURCE.[DataDate] = TARGET.[DataDate]
    AND SOURCE.[LoanNum] = TARGET.[LoanNum]
WHEN NOT MATCHED BY TARGET--record in SOURCE but not in TARGET
THEN INSERT
(
     [DataDate]
    ,[LoanNum]
)
VALUES
(
     SOURCE.[DataDate]
    ,TARGET.[LoanNum]
);

您的主键违规可能是因为您使用 (Date, Loan#) 作为唯一性标准,而您的主键可能仅在 Loan# 上。