如何正确避免在没有任何PK的SQL Server数据表中插入重复行?

问题描述:

我在C#中使用SqlBulkCopy类将数据从一个SQL Server数据库快速复制到另一个数据库。这些数据库位于不同的服务器中,它们的数据表没有任何PK,所以过程变得更加复杂。如何正确避免在没有任何PK的SQL Server数据表中插入重复行?

的问题是,我使用的是从原始数据库中选择数据的查询得到重复的行和SqlBulkCopy无法避免在目标数据库中插入重复记录。

我不能使用SELECT *,因为它会抛出OutOfMemoryException,所以我做了SELECT TOP X *并将该数据加载到DataTable中。在每个Datatable中,我可以使用C#删除重复的记录,但是当我选择下一个TOP X时,所选的第一行可能等于之前DataTable中已经插入目标数据库的最后一行。 DataTable变量总是相同的,它被重新加载!

我想避免重复记录被未插入创建PK,因为它并不适用于我的情况。我真的需要使用SqlBulkCopy,因为快速复制是系统要求。任何建议?先谢谢你!

+1

将数据加载到临时表中,然后将数据从临时表移动到最终表,删除数据库中的重复项。 –

+0

我在想这件事,也许这真的是这种情况的唯一选择。我需要更多地研究这个问题。说明表与临时表相同吗?它们是否应该与最终表格在同一个数据库中创建? – AnnaB

+0

可以;你只是做SELECT DISTINCT? – SomeStudent

请勿使用C#。

您可以右键单击您的源数据库SSMS中,选择“任务”,然后选择“生成脚本”。选择你想要的表格并使用向导来生成插入脚本。然后在第二个数据库上运行这些。

如果需要重复此操作,可以在两个SQL Server实例之间设置一个Linked Server,然后在Stored Procedure中写入一个插入语句。然后,您可以随时运行该存储过程,或者call it from C#

如果你希望它运行规律,你可以建立一个Job on the database

+0

这不是一个可行的解决方案,因为原始数据库一直在增加。我需要使用OOP语言,因为解决方案需要其他内容。任何其他建议Tom.Bowen?谢谢你的回答! – AnnaB

+0

为什么它必须是OOP语言?你只需要一次又一次自动完成的事情? –

+0

@mvc我已经添加了一些更多的选项来实现你所需要的。 –

你有没有考虑复制行出来的第一个数据库到磁盘上,而不是在存储器中的文件?然后,您将能够一次性完成所有这些工作,而不需要使用select top X *进行批次处理。一旦数据在磁盘上,就可以对它进行排序 - 甚至可以使用处理大文件的Unix sort的实现 - 并删除重复的记录。

如果你想删除重复项,然后在某一时刻,您将需要在一个地方所有的数据,要么对其进行排序或作出它的索引。这可以在第一个数据库,内存中,磁盘上或第二个数据库中。有一些原因可能导致您不想在任一数据库中建立索引,并且没有空间存储内存中的所有数据,因此似乎将其假脱机磁盘作为唯一选项。我个人认为,做一个主键非常困难。虽然你说它不适用,但它可能是值得让它只是为了帮助数据加载。