我创建了一个带有 for循环容器的SSIS 2012软件包,计划连续运行(无限循环),这样它就可以在将传入的Excel文件放入指定的放置目录后立即对其进行处理。处理包括首先清除目标SQL Server 2012数据库表中的所有现有记录,然后将Excel中的数据批量插入表中。显然它需要维护事务,以便在批量插入失败(由于文件数据无效等)的情况下可以回滚数据删除操作。
以下是for循环容器中的任务:
脚本任务,它利用C# FileSystemWatcher 来监视放入drop文件夹的Excel文件。
使用以下语句执行SQL任务:
开始交易tran1;
数据流任务,使用Excel Source和OLEDB目标将数据从Excel插入SQL Server数据库表。此任务具有OnError错误处理程序,该处理程序使用执行SQL任务将错误详细信息记录到用户定义的错误日志表。
关于上述成功优先约束,使用以下语句执行SQL任务:
提交交易tran1;
回滚事务tran1;
请注意,我无法使用默认的基于DTC的事务,因为数据库服务器中未启用MSDTC。因此使用本机SQL事务。此外,我在所有与DB相关的任务中使用单个OLEDB连接管理器(它是一个远程Sql Server数据库,因此使用OLE DB)。 Oledb连接管理器的 RetainSameConnection 属性设置为True。此外,所有与数据库相关的任务都将其事务选项设置为支持。 但是,在使用包含无效数据的传入Excel文件运行程序包时,用于回滚的任务#5会引发跟随错误,并且同样会记录到错误日志表中:
ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION
我应该补充一点,对于有效的Excel文件,程序包运行正常,提交事务(任务#4)完成且没有错误。 知道什么可能导致事务回滚抛出错误?
答案 0 :(得分:0)
我能够通过将故障优先约束从DFT更改为回滚EST从逻辑AND到逻辑OR 来解决此问题。