2010-05-20 104 views
0

我在想如何在同一時間進行批量插入和批量複製?我有2個表應該受到大容量複製的影響,因爲它們都相互依賴。關於SQl BulkCopy的問題

所以我希望它,如果當插入表1一個記錄死亡它會回滾和表2永遠不會得到更新。此外,如果表1插入好,表2更新失敗,表1將回滾。

這可以通過批量複製來完成嗎?

編輯

我應該提到我做的雖然C#中的批量插入。

它看起來像這樣,但這是我一直在努力的一個例子。所以,我不知道如果我要改變它是一個存儲過程(不知道它會如何看待和C#代碼是什麼樣子)

private static void BatchBulkCopy() 
{ 
    // Get the DataTable 
    DataTable dtInsertRows = GetDataTable(); 

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
    { 
     sbc.DestinationTableName = "TBL_TEST_TEST"; 

     // Number of records to be processed in one go 
     sbc.BatchSize = 500000; 

     // Map the Source Column from DataTabel to the Destination Columns in SQL Server 2005 Person Table 
     // sbc.ColumnMappings.Add("ID", "ID"); 
     sbc.ColumnMappings.Add("NAME", "NAME"); 

     // Number of records after which client has to be notified about its status 
     sbc.NotifyAfter = dtInsertRows.Rows.Count; 

     // Event that gets fired when NotifyAfter number of records are processed. 
     sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied); 

     // Finally write to server 
     sbc.WriteToServer(dtInsertRows); 
     sbc.Close(); 
    } 

} 

回答

0

我在想如何做一個質量 插入和批量複製在同一時間? 我有兩個表應該影響 的大容量副本,因爲他們都取決於 彼此。所以我想,如果 在插入表1 a記錄時死亡 它會回滾並且表2從不會更新 。另外如果表1插入 good和表2更新失敗表 1得到回滾。這可以通過批量複製 完成嗎?

否 - SqlBulkCopy的全部內容是儘可能快地將數據導入數據庫。它只會將數據轉儲到一個表中。

正常的用例是在導入表後檢查該表,並開始「分割」數據並將其存儲到任何需要去的位置 - 通常是通過存儲過程(因爲數據已經是在服務器上,並且您想要將其分發到其他表 - 您不希望將所有數據重新下載到客戶端,檢查它,然後再將它發送回服務器一次)。

SqlBulkCopy只抓取一堆數據並將其放入表中 - 非常快。它不能不能根據標準或條件將數據分成多個表。

0

您可以運行批量插入內用戶定義的事務,這樣做這樣的事情:

BEGIN TRANSACTION MyDataLoad 
BEGIN TRY 

BULK INSERT ... 

BULK INSERT ... 

COMMIT TRANSACTJION MyDataLoad 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH 

但是,可能有其他方法來實現你想要的。在批量插入它們之前,表格是否已空?當你說這些表彼此依賴時,你的意思是說你想強制執行外鍵約束?

+0

對不起,我應該提到,我正在通過C#代碼完成此操作。所以我不確定我如何做你所展示的。它們是外鍵約束,但是當我說相互依賴時,我的意思是表2已經被填充,但是當插入發生時,我希望表2中的記錄進入激活狀態(這是用於許可證,本質上是發生了什麼)獲取用戶列表,他們每個都獲得一個已經在數據庫中的密鑰,但設置爲非活動狀態,所以我想在此時將其更改爲活動狀態)。 – chobo2 2010-05-20 23:41:21