2009-09-14 85 views
2

我正在尝试批量上传到SQL服务器数据库中。源文件有我想删除的副本,所以我希望操作会自动上传第一个,然后丢弃其余的。 (我设置了一个唯一的键约束)。问题是,当尝试重复上传时,整个事件失败并被回滚。有什么方法可以告诉SQL继续前进吗?SQL导入跳过重复项

+1

也许显示一些代码,可能只是选择不同。 – madcolor 2009-09-14 16:22:07

+0

@madcolor:重复项在'insert'中,而不在'select'中。 – voyager 2009-09-14 16:28:56

+0

@voyager - 他从具有重复项的源文件插入。我相信@MadColor建议重新创建源文件以通过使用select distinct语法消除重复项。 – klabranche 2009-09-14 16:30:57

回答

7

尝试大量数据插入到临时表,然后SELECT DISTINCT作为@madcolor建议或WHERE子句中

INSERT INTO yourTable 
SELECT * FROM #tempTable tt 
WHERE NOT EXISTS (SELECT 1 FROM youTable yt WHERE yt.id = tt.id) 

或其它字段。

1

如果你是通过一些像SQL Plus或DBVis或Toad这样的SQL工具来做这件事的话,我怀疑不是。如果你用语言进行编程,那么你需要分而治之。假设一行一行地执行更新并捕获每个异常将是一个过程太冗长,所以相反,您可以首先在整个SQL块上执行批处理操作,如果失败,则在前半部分执行该操作,如果失败,在上半场的前半段进行。迭代这种方式,直到你有一个成功的块。放弃该块并在其余的SQL上执行相同的过程。任何违反约束的东西最终都会成为您知道要记录并丢弃的唯一SQL语句。这应该导入尽可能多的批量处理,同时仍然抛出无效行。

0

为此使用SSIS。你可以告诉它跳过重复。但首先确保它们是真实的重复。如果某些列中的数据不同,那么如何知道哪些记录更好?