簡體   English   中英

關於SQl BulkCopy的問題

[英]Questions About SQl BulkCopy

我想知道如何同時批量插入和批量復制? 我有2個表應受到批量復制的影響,因為它們彼此依賴。

因此,我希望如果在插入表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();
    }

}

您可以在用戶定義的事務內運行批量插入,因此請執行以下操作:

BEGIN TRANSACTION MyDataLoad
BEGIN TRY

BULK INSERT ...

BULK INSERT ...

COMMIT TRANSACTJION MyDataLoad
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

但是,可能還有其他方法可以完成您想要的事情。 在批量插入表之前,表是否為空? 當您說這些表相互依賴時,是否意味着您要強制執行外鍵約束?

我想知道如何同時批量插入和批量復制? 我有2個表應受到批量復制的影響,因為它們彼此依賴。 因此,我希望如果在插入表1時一條記錄死亡,它會回滾,而表2永遠不會更新。 同樣,如果表1插入良好,而表2更新失敗,則表1會回滾。 可以使用批量復制嗎?

否-SqlBulkCopy的全部目的是使數據盡快進入數據庫。 它將僅將數據轉儲到單個表中。

正常的用例是在導入該表之后對其進行檢查,然后開始“拆分”該數據並將其存儲到所需的任何位置-通常通過存儲過程(因為數據已經在服務器上,並且您想將其分發到其他表-您不想將所有數據拉回客戶端,對其進行檢查,然后再將其發送回服務器)。

SqlBulkCopy只獲取一堆數據並將其放入表中-很快。 不能根據條件或條件將數據分成多個表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM