说,你从C#开始一个SqlTransaction,你在其中将数据从DataTable插入到SQL表中,但是这个数据是很多数据,所以你在SQL事务中使用SqlBulkCopy进行“in chunks”和只有在所有块成功复制的情况下才提交事务。
现在,假设您知道有时插入的值的长度将超过目标表中的最大列大小,因此SqlBulkCopy将在该点处针对该特定“块”失败。是否有可能(甚至可取)捕获此异常并更改表/列以增加目标列的最大长度,然后继续SqlBulkCopy'数据获取要复制的下一个“块”,即使您没有你开始提交“插入交易”了吗?
因此,尝试解释一下,是否可以启动DML事务,在此未提交的事务中停止,执行DDL以更改目标表,然后完成原始DML并提交它?
答案 0 :(得分:2)
要回答您的问题,可以在insert语句之间修改表。如果将事务的范围限定为每个批处理,那么您只需要回滚1个批处理以更新列长度。这种方法比在开始数据插入之前设置列长度有更多的开销。
一种好的方法是检查源数据的每一列的最大长度,然后在开始数据导入之前使用新的列长度更新目标数据库。这样您就知道目标数据库可以接受它将提供的所有数据。