2010-05-20 2 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

Мне интересно, как сделать массовую вставку и объемную копию одновременно? У меня есть 2 таблицы, которые должны влиять на объемной копией, поскольку оба они зависят от друг от друга. Поэтому я хочу, чтобы, если при вставке таблицы 1, запись умирает , она возвращается и таблица 2 никогда не обновляется. Также, если таблица 1 вставляет , а таблица 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

Смежные вопросы