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