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# 上。
我有一个有两行的临时 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# 上。