【问题标题】:Questions About SQl BulkCopy关于 SQL 批量复制的问题
【发布时间】:2010-05-20 23:05:27
【问题描述】:

我想知道如何同时进行批量插入和批量复制?我有 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();
    }

}

【问题讨论】:

    标签: c# sql-server sql-server-2005 sqlbulkcopy


    【解决方案1】:

    我想知道如何做弥撒 同时插入和批量复制? 我有 2 张桌子应该受到影响 通过批量复制,因为它们都依赖 在彼此身上。所以我想要它,如果 在插入表 1 时,一条记录死亡 它被回滚,表 2 永远不会 得到更新。此外,如果表 1 插入 好和表 2 更新失败表 1 被回滚。可以这样做吗 批量复制?

    不 - SqlBulkCopy 的全部意义在于尽可能快地将数据输入数据库。它只会将数据转储到一个表中。

    正常的用例是在导入该表后检查该表,并开始“拆分”该数据并将其存储到它需要去的任何地方 - 通常通过存储过程(因为数据已经在服务器,并且您希望将其分发到其他表 - 您不想将所有数据拉回客户端,检查它,然后再将其发送回服务器一次)。

    SqlBulkCopy 只抓取一堆数据并将其放入表中 - 非常快。它不能根据条件或条件将数据拆分为多个表。

    【讨论】:

      【解决方案2】:

      您可以在用户定义的事务中运行批量插入,因此请执行以下操作:

      BEGIN TRANSACTION MyDataLoad
      BEGIN TRY
      
      BULK INSERT ...
      
      BULK INSERT ...
      
      COMMIT TRANSACTJION MyDataLoad
      END TRY
      BEGIN CATCH
          ROLLBACK TRANSACTION
      END CATCH
      

      但是,可能还有其他方法可以实现您想要的。在批量插入之前,这些表是空的吗?当您说表相互依赖时,您的意思是您要强制执行外键约束吗?

      【讨论】:

      • 对不起,我应该提到我是通过 C# 代码来做这一切的。所以我不确定我是如何做你所展示的。它们是外键约束,但是当我说相互依赖时,我的意思是表 2 已经填满,但是当插入发生时,我希望表 2 中的记录进入激活状态(这是用于许可证,本质上是我正在发生的事情获取用户列表,他们每个人都得到一个已经在数据库中但设置为非活动的密钥,所以我想在这个时候将它更改为活动)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2015-04-18
      • 2011-05-12
      • 1970-01-01
      • 2019-04-29
      • 2013-07-02
      相关资源
      最近更新 更多