【问题标题】:Is it possible to ALTER TABLE (DDL) in the middle of an DML transaction on the same table?是否可以在同一张表上的 DML 事务中间进行 ALTER TABLE (DDL)?
【发布时间】:2013-07-24 10:48:32
【问题描述】:

说,您从 C# 开始一个 SqlTransaction,在其中您将 DataTable 中的数据插入到 SQL 表中,但是这些数据包含大量数据,因此您在 SQL 事务中使用 SqlBulkCopy 来“分块”执行此操作,并且仅当所有块复制成功时才提交事务。

现在,假设您知道插入的值的长度有时会超过目标表中的最大列大小,因此 SqlBulkCopy 将在该特定“块”的点上失败。是否有可能(甚至可取)捕获此异常并更改表/列以增加目标列的最大长度,然后继续 SqlBulkCopy'ing 数据拾取下一个要复制的“块”,即使您没有提交了您开始时的“插入事务”?

那么,试着解释一下,是否可以启动一个 DML 事务,在这个未提交的事务中间停止,执行一个 DDL 来更改目标表,然后完成原始 DML 并提交它?

【问题讨论】:

    标签: c# ddl sqlbulkcopy dml sqltransaction


    【解决方案1】:

    要回答您的问题,可以在插入语句之间修改表。如果您将事务范围限定为每个批次,那么您只需回滚 1 个批次即可更新列长度。与在开始数据插入之前设置列长度相比,这种方法的开销更大。

    一个好的方法是检查源数据的每一列的最大长度,然后在开始数据导入之前使用新的列长度更新目标数据库。这样您就知道目标数据库可以接受它将提供的所有数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 2014-05-13
      • 1970-01-01
      • 2023-03-21
      • 2012-11-07
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多