使用C#(vs2005)我需要将一个表从一个数据库复制到另一个数据库。两个数据库引擎都是SQL Server 2005.对于远程数据库,源代码,我只对存储过程具有执行权限,以获取本地需要的数据。
本地数据库我有更多的控制权,因为[asp.net]应用程序需要这个远程表的本地副本。我们希望它本地更容易查找和连接其他表等。
请您向我解释一种将此数据复制到本地数据库的有效方法。
如果本地表更简单,则可以使用与远程表相同的模式创建本地表。远程表有9列,其中没有一列是标识列。远程表中大约有5400行,每年增加约200行。所以不是一个快速变化的表。
答案 0 :(得分:11)
也许是SqlBulkCopy;使用SqlCommand.ExecuteReader获取在调用SqlBulkCopy.WriteToServer时使用的阅读器。这与bulk-insert相同,所以非常快。它应该看起来像一样(未经测试);
using (SqlConnection connSource = new SqlConnection(csSource))
using (SqlCommand cmd = connSource.CreateCommand())
using (SqlBulkCopy bcp = new SqlBulkCopy(csDest))
{
bcp.DestinationTableName = "SomeTable";
cmd.CommandText = "myproc";
cmd.CommandType = CommandType.StoredProcedure;
connSource.Open();
using(SqlDataReader reader = cmd.ExecuteReader())
{
bcp.WriteToServer(reader);
}
}
答案 1 :(得分:10)
答案 2 :(得分:2)
我首先考虑使用SQL Server集成服务(SSIS,née数据传输服务(DTS))。
它专为在数据库之间移动/比较/处理/转换数据而设计,IIRC允许对源进行任意表达。您需要在数据库上安装它(不应该是一个问题,它是默认安装的一部分)。
否则,给定数据大小(小)的代码解决方案会将删除系统中的所有数据拉入内部结构,然后查找本地不存在的行以进行插入。
答案 3 :(得分:1)
您可能无法做到这一点,但如果您不能这样做,请不要使用程序。如果您有任何方式与控制源服务器的人交谈,请查看他们是否会设置某种类型的数据导出。如果数据与你说的一样小,那么xml或csv输出比用c#(或任何语言)编写的东西要好100倍。
因此,我们假设他们无法导出,仍然避免编写程序。你说你对目的地有更多的控制权。您可以设置SSIS包,还是设置链接服务器?如果是这样,您将更容易迁移数据。
如果您将源代码设置为链接服务器,则可以编写一个小的t-sql批处理
TRUNCATE DestTable
INSERT INTO DestTable SELECT SourceTable.Star FROM [SourceServer]。[Schema]。[Table]
不会像SSIS那样好(你有更多关于发生了什么的视觉,但上面的t-sql非常清楚)。
由于我不接受编程路线,如果你绝对必须,我能给你的最佳解决方案是:
使用SqlClient命名空间。
因此,创建2个SqlConnections,2个SqlCommands,并获取1个SqlReader的实例。
遍历源阅读器,并使用。
为每次迭代执行目标SqlCommand插入。它会很难看,但它会起作用。
答案 4 :(得分:0)
似乎不是必须同步的大量数据。在您描述的条件下(只有SP访问远程数据库而无法获得其他任何东西),您可以使用Marc Gravell的解决方案。 在数据只能增长且现有数据无法更改的情况下,您可以比较远程数据库和内部数据库上的记录数,以优化操作;如果远程数据库中没有变化则无需复制。