【问题标题】:Copy table data from one server to other server将表数据从一台服务器复制到另一台服务器
【发布时间】:2012-09-05 19:53:27
【问题描述】:

服务器A

Table1
Id  Name    State   Country
1   Abc OH  USA

Table2
Id  Counties    Places
1   abc     def
1   koi     koii
1   joi     joio

服务器B

Table1
Id  Name    State   Country

Table2
Id  Counties    Places

我在两台服务器下都有 2 台服务器 ServerA 和 ServerB,有两个表 Table1/Table2 我试图将 Table1 中的单行和 Table2 中的关联行复制到 ServerB 的 Table1 和 Table2。

这就是我尝试这样做的方式:

connection1 = connection to ServerA
connection2 = connection to ServerB

SqlCommand cmd1 = new SqlCommand("Select * from Table1 where id = 1");
SqlCommand cmd2 = new SqlCommand("Select * from Table2 where id = 1");

Connection1.Open();
Connection2.Open();

SqlDataReader reader1 = cmd1.ExecuteReader();
SqlDataReader reader2 = cmd2.ExecuteReader();

var value1 = reader1.read();
var value2 = reader2.read();

我使用SqlDataReader 并执行上述命令并获取数据并将其插入ServerB Table1 and Table2。 这是正确的方法吗?可以用更好的sql命令吗?

【问题讨论】:

  • 如果都是 Sql-Server 数据库,你应该链接两个服务器并直接按 sql 将它们复制到数据库中,而不是先将它们全部加载到内存中。

标签: sql sql-server-2008 c#-4.0


【解决方案1】:

尝试使用 SQLBULKCOPY (See Example here) 更快,尤其是在您拥有大量数据的情况下

【讨论】:

  • 那么我应该运行 SqlBulk 2 次吗?复制两个表?
  • yes.. 你可以为 SQLBULKCOPY 创建一个带参数的函数并调用两次
  • 即使两个表相互关联,就像父子表一样。有没有办法做单拷贝和插入?
  • 很抱歉打扰您,但还有一个问题 - 在这种情况下主键会发生什么?目标表是自己生成主键还是从源表中插入?
  • 你可以做任何一种方式。如果目标表有标识列,那么你不必转移它
【解决方案2】:

大多数数据库允许您连接到其他数据库。特定的 sytnax 高度依赖于数据库。但是,一旦你这样做了,你可以这样做:

select *
into server2.<db2>.<schema2>.table2
from server1.<db>.<schema>.table1

create table server2.<db2>.table2 as
    select *
    from server1.<db>.table1

(语法取决于数据库。第一个是sql-server-like,第二个是oracle-like。)

如果您的数据有任何大小,使用链接服务器绝对是最好的方法。通过将其读入内存,您可能会想一次读取并插入一行。如果您的行数超过几十行,您会发现这种方式比必要的更耗时。

【讨论】:

  • 我无法使用链接服务器。因为我没有对数据库的任何访问权限。我只能使用连接字符串连接到数据库。我正在使用 SQL2008。有什么建议我现在该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多