2015-06-30 82 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)的幾個有用的鏈接。 –