3

我有一个数据库服务器,作为主要的 SQL Server,包含一个保存所有数据的表。其他数据库服务器进出(SQL Server 的不同实例)。当他们上线时,他们需要从主表下载数据(在给定的时间段内),然后他们生成自己的附加数据到同一个本地 SQL Server 数据库表,然后希望只用新数据更新主服务器,经常使用 C# 程序,通过预定的服务。多个额外的服务器可以同时生成数据,尽管不会那么多。

主表将始终在线。附加的非主数据库表并不总是在线,也不应该是主表的完全相同的副本,首先它会包含主数据的一个子集,然后它会生成自己的附加数据到本地表并每隔一段时间更新主表经常与它的更新。可能会生成和/或下载相当数量的行。所以需要一个有效的算法来从额外的数据库复制到主表。

在 C# 中传输它的最有效方法是什么?SqlBulkCopy 看起来不起作用,因为我在主服务器中不能有重复的条目,如果检查约束,它会失败,因为某些条目已经存在。

4

4 回答 4

1

您可以在 DB 或 C# 中执行此操作。在所有情况下,您都必须执行类似Using FULL JOINs to Compare Datasets之类的操作。你已经知道了。

最重要的是在交易中做到这一点。如果您有 100k 行,则将其拆分为每个事务 1000 行。或者尝试确定每个事务的哪种行组合最适合您。

使用小巧玲珑。它真的很快。

如果您有 C# 中的所有数据,请使用TVP将其传递给 DB 存储过程。在存储过程中使用MERGEUPDATE/DELETE/INSERT数据。

最后。在 C# 中使用Dictionary<Tkey, TValue>或与O(1)访问时间不同的东西。

于 2013-05-20T21:45:17.193 回答
0

SQLBulkCopy 是将数据从 C# 程序插入表的最快方法。我已经用它在数据库之间复制数据,到目前为止,没有什么比它更快的速度了。这是一个很好的通用示例:通用批量复制

当您将数据下载到本地数据库服务器时,我会在主服务器的表中使用IsProcessed 标志并跟踪主表的主键。然后您应该能够再次对主服务器进行删除和更新。

于 2013-05-20T21:48:16.143 回答
0

这是我将如何做到的:

  1. 在主表数据库上创建一个存储过程,该存储过程接收与主表结构相同的用户定义表变量。

它应该做类似的事情 -

INSERT INTO yourtable (SELECT * FROM tablevar)

或者,您可以将该MERGE语句用于插入或更新功能。

  1. 在代码中,(Windows 服务)从辅助表中加载所有(或部分)数据,并将其作为表变量发送到存储过程。

  2. 您可以批量执行 1000 个,并且每次更新批量时,您都应该在源表/源更新程序代码中标记它。

于 2013-05-20T21:24:27.660 回答
0

您可以为此使用链接服务器吗?如果是,它将使从主服务器和向主服务器复制数据变得更加容易。

将数据复制回主服务器时,我会在每个 INSERT 语句之前使用 IF EXISTS 以另外确保没有重复并将所有插入语句封装到事务中,以便在发生错误时回滚事务。

我也同意其他人在 1000 条左右的记录上分批执行此操作,这样如果出现问题,您可以限制损失。

于 2013-05-21T09:03:54.827 回答