我在一个空表中插入了大量的行,并且在一列上有一个主键约束。 如果存在重复键错误,是否有任何方法可以找出导致错误的键(或行)的值?
在插入之前验证数据遗憾的是我现在无法做的事情。
使用SQL 2008。
谢谢!
按件进行计数(*)/分组是我要避免的,这是从数百个不同的数据库(其中一些在远程服务器上)插入数亿行... ...我没有时间或空间进行两次插入。
数据应该是提供商的唯一数据,但不幸的是,他们的验证在100%的情况下似乎无法正常工作,我试图至少看到它失败的地方,所以我可以帮助他们排除故障。< / p>
谢谢!
答案 0 :(得分:3)
没有办法做到这一点不会减慢你的过程,但这是一种让它变得更容易的方法。您可以在该表上添加替代触发器以进行插入和更新。触发器将在插入之前检查每个记录,并确保它不会导致主键违规。您甚至可以创建第二个表来捕获违规,并在该表上使用不同的主键(如标识字段),触发器会将行插入到错误捕获表中。
以下是触发器如何工作的示例:
CREATE TRIGGER mytrigger ON sometable
INSTEAD OF INSERT
AS BEGIN
INSERT INTO sometable SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 1 FROM inserted;
INSERT INTO sometableRejects SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 0 FROM inserted;
END
在那个例子中,我在检查字段以确保它在将数据插入表格之前是数字。您需要修改该代码以检查主键违规 - 例如,您可以将INSERTED表连接到您自己的现有表,并仅在您找不到匹配项的位置插入行。
答案 1 :(得分:1)
解决方案取决于这种情况发生的频率。如果它是<10%的时间,那么我会做以下事情:
这意味着它只会在发生错误的几次时花费你。
如果这种情况经常发生,那么我会把男孩们送去看看提供者: - )
答案 2 :(得分:0)
:
既然您不想插入两次,可以:
Drop the primary key constraint.
Insert all data into the table
Find any duplicates, and remove them
Then re-add the primary key constraint
上一篇回复: 将数据插入表的副本,而不使用主键约束。
然后对其运行查询以确定具有rpimary键列重复值的行。
select count(*), <Primary Key>
from table
group by <Primary Key>
having count(*) > 1
答案 3 :(得分:0)
使用SSIS导入数据,并将其作为数据流的一部分进行检查。这是最好的处理方式。 SSIS可以将错误记录发送到一个表(您可以稍后发送给供应商以帮助他们清理他们的行为)并处理好的记录。
答案 4 :(得分:0)
我无法相信SSIS不能轻易解决这个“现实”,因为,让我们面对它,通常你需要并希望能够:
我不明白他们如何在没有这种易于使用的内置功能的情况下让产品出门。比方说,设置一个组件的属性来自动检查它。