0

比如说,您从 C# 开始一个 SqlTransaction,在其中您将 DataTable 中的数据插入到 SQL 表中,但是这些数据是大量数据,因此您在 SQL 事务中使用 SqlBulkCopy 进行“分块”,并且只提交如果所有块都成功复制,则交易。

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

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

4

1 回答 1

2

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

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

于 2013-07-24T19:33:44.433 回答