Вопросы о SQl BulkCopy - PullRequest
       34

Вопросы о SQl BulkCopy

0 голосов
/ 21 мая 2010

Мне интересно, как можно сделать массовую вставку и массовую копию одновременно?У меня есть 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();
    }

}

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

Мне интересно, как можно сделать массовую вставку и массовую копию одновременно?У меня есть 2 таблицы, на которые должна влиять массовая копия, так как они зависят друг от друга.Поэтому я хочу, чтобы при вставке таблицы 1 запись умирала, она откатывалась, а таблица 2 никогда не обновлялась.Также, если в таблицу 1 вставлены хорошие данные, а в таблице 2 происходит сбой обновления, таблица 1 откатывается.Можно ли это сделать с помощью массового копирования?

Нет - весь смысл SqlBulkCopy в том, чтобы как можно быстрее получить данные в вашу базу данных.Он будет просто выгружать данные в одну таблицу.

Обычный вариант использования будет заключаться в том, чтобы затем проверить эту таблицу после ее импорта и начать "разбивать" эти данные и сохранять их в любом месте, где это необходимопройти - обычно через хранимую процедуру (поскольку данные уже находятся на сервере, и вы хотите распределить их по другим таблицам - вы не хотите передавать все эти данные клиенту, проверять их, а затем отправлять ихвернемся к серверу еще раз).

SqlBulkCopy только захватывает кучу данных и помещает их в таблицу - очень быстро. не может разбивать данные на несколько таблиц на основе критериев или условий.

0 голосов
/ 21 мая 2010

Вы можете запускать массовые вставки внутри пользовательской транзакции, поэтому сделайте что-то вроде этого:

BEGIN TRANSACTION MyDataLoad
BEGIN TRY

BULK INSERT ...

BULK INSERT ...

COMMIT TRANSACTJION MyDataLoad
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

Однако могут быть и другие способы выполнить то, что вы хотите. Таблицы пустые, прежде чем вы массово вставите в них? Когда вы говорите, что таблицы зависят друг от друга, вы имеете в виду наличие ограничений внешнего ключа, которые вы хотите применить?

...