2015-06-30 83 views
2

要将数据从一个数据库复制到具有相同模式的不同服务器中的另一个数据库,我计划使用C sharp库中的SqlBulkCopy类。插入记录时,SqlBulkCopy是否将保持与数据表中相同的顺序?SqlBulkCopy插入顺序

例如:id是标识列。

Server1上,DB1

TableA 
id name 
1 name10 
2 name20 
3 name30 
4 name40 

Server2上,DB1

TableA 
    id name 
    1 name1 
    2 name2 
    3 name3 
    4 name4 
    .......... 
    .......... 
    5000 name22 
    5001 name33 
  • 第一步:var dt = select * from server1.dbo.TableA order by id;
  • 第二步:SQL批量复制到服务器2 bulkCopy.WriteToServer(dt);
  • 第三步:var resultDt = select top 4 id from server2.dbo.TableA order by id desc.既然我们知道了我们进入的记录数我正在使用“前4名”。
  • 第四步:resultDt.DefaultView.Sort = "id asc";

问: ID是否在resultDt将代表ID在DT的所有行?即,。

5002 from server2 = 1 from server1 
5003 from server2 = 2 from server1 
5004 from server2 = 3 from server1 
5005 from server2 = 4 from server1 

注意:只是为了举例,我给了更少的记录。实际表格包含数千条记录。

+0

与您的问题没有关系,但是您可以通过将步骤1中的IDataReader馈送到步骤2中的WriteToServer来节省内存,跳过数据表 –

回答

1

看起来在批量插入时不能保证订单。所以我在目标表中添加了一个临时ID列。流程如下:

Step1: var dt = select *, id as tempId from server1.dbo.TableA order by id; 
Step2: SQL bulk copy into server2 bulkCopy.WriteToServer(dt); 
Step3: var resultDt = select top 4 id, tempId from server2.dbo.TableA order by id desc. Since we know the number of records we inserted I am using "top 4". 

现在id将是server2生成的新id,tempId将是server1的id。问题解决了:)

+1

您是对的,因为没有订单保证。当我不得不通过文本文件来做这件事时,当我逐行读取文件时,我有一个添加“订单”列的中间步骤。然后,我将其添加到我的临时表中,并在我的SqlBulkCopy示例中使用。如果你想看看,有评论[这里](http://stackoverflow.com/a/10775945/685760)的几个有用的链接。 –