2009-02-04 55 views
4

我将大量的行插入一个列上具有主键约束的空表中。 如果有重复键错误,是否有任何方法可以找出导致错误的键(或行)的值?在sql2008中违反主键约束的详细错误消息?

在插入之前验证数据可悲的是我现在不能做的事情。

使用SQL 2008.

谢谢!


在做COUNT(*)/以物组是什么我试图避免的,这是数亿行的,从数百种不同的DB的(其中一些是在远程服务器上)插入...我没有时间或空间来插入两次。

数据应该是唯一的提供者,但不幸的是他们的验证似乎并没有正常工作100%的时间,我试图至少看到它的失败,所以我可以帮助他们排除故障。

谢谢!

回答

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 
+0

奇怪的做法。现在你有一个填充了重复的表格,这意味着在稍后阶段删除。 – 2009-02-04 23:00:20

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表加入到您自己的现有表中,并且只在没有找到匹配的地方插入行。

0

使用SSIS导入数据并让它检查这是数据流的一部分。这是处理的最佳方式。 SSIS可以将不良记录发送到一个表格(您可以稍后发送给供应商以帮助他们清理其行为)并处理好这些记录。

1

解决方案将取决于发生这种情况的频率。如果它的时间< 10%的话,我会做到以下几点:

  1. 插入数据
  2. 如果错误,那么就Bravax修订后的溶液(删除约束,插入,找到DUP,报告并杀死DUP,启用约束)。

这意味着它只会在出现错误的几次时花费您的代价。

如果这是更经常发生,那么我想看看在送男生看到供应商的:-)

0

我不能相信,SSIS不容易解决这个“现实”,因为,让我们面对它,你经常需要并希望能够:

  1. 看到,如果一个记录有存在一定的唯一或主键
  2. 如果没有,将其插入
  3. 如果确实如此,无论是忽略它或更新它。

我不明白他们如果没有这种容易使用的内置功能就会让产品出门。比如说,设置一个组件的属性来自动检查这个。

相关问题