【发布时间】:2015-05-27 16:50:19
【问题描述】:
我正在 Microsoft SQL Server 2005 上执行存储过程。有问题的代码已经完美运行了大约 12 个月,但现在因“重复密钥违规错误”而失败
如何获得重复的密钥违规错误?
这是错误:
违反主键约束“Pk_temp_item_sales_details” 无法在对象“dbo.temp_item_sales_details”中插入重复键。 [SQLSTATE 23000][Error2627]
这是执行的 SQL:
TRUNCATE TABLE temp_item_sales_details;
INSERT INTO temp_item_sales_details
(item_id,
last_order_date)
SELECT detail.item_no,
Max(header.sales_invoice_date)
FROM invoice_header header WITH(NOLOCK)
JOIN invoice_detail detail WITH(NOLOCK)
ON header.invoice_number = detail.invoice_no
WHERE Isnumeric(detail.item_no) = 1
GROUP BY detail.item_no
invoice_detail 表中的item_no 是varchar,而temp_item_sales_details 表中的item_id 是numeric,但我只选择带有ISNUMERIC(detail.item_no) = 1 的数值
【问题讨论】:
-
确保
Truncate语句在Insert之前执行 -
如果您担心准确性,那么您应该停止使用 NOLOCK。该提示远不止是“读取未提交的事务”,这是普遍的想法。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
标签: sql-server stored-procedures sql-server-2005 unique-constraint