我有一个控制流,它使用执行SQL任务设置用户变量。在Visual Studio中一切正常,但是一旦我将它部署到SSIS目录,变量似乎就不会被分配。我正在针对完全相同的数据源执行它。
我将准确解释发生了什么......
序列容器中的第一个任务从状态表中读取为表记录的最后一个LSN。如果该表没有条目,则它遵循上图中的路径 1 。
在步骤 2 ,它使用源数据库上的CDC函数读取表的最小LSN。然后,它将LSN和该LSN的日期时间存储在两个用户变量中。这是"窗口开始"用于数据复制。
步骤 3 从目标表中读取最大更改日期。
如果窗口开始位于最新更改日期之前,则跳过 4 分支,因为这会导致将重复数据导入目标表。 (我只想说在加载到目标表之前我可以进行重复数据删除...)
当我在Visual Studio中运行项目时,一切正常。它将继续执行步骤1-3,然后继续执行DFT,因为表的最小LSN位于目标表中的最大更改日期之后。我使用了断点来确保变量实际上已正确设置。
将项目部署到SSIS目录后,按照步骤4进行操作,并记录错误行。它似乎没有设置变量或约束表达式不使用正确的值。我尝试使用结果集设置变量,并在Execute SQL任务中设置输出参数。我可以从日志消息中看到源表中的最大更改日期是正确的。
奇怪的是,日志消息中变量的值与设计时间值不同。设计时间值为" 1899-12-25 14:20:00'但是日志消息显示' 1899-12-30 00:00:00'但这可能取决于我使用错误的转换方法或其他东西......我还没有调查它,因为它仍然不应该遵循路径4。
它在Visual Studio中按预期运行但在服务器上具有不同的行为这一事实对我来说非常困惑。我想不出可能导致这种情况的原因。
包是使用BIML创建的,但我不认为实际上有任何连接。完整的解决方案复制了100多个表,每个表一个包。即使我尝试仅调试单个程序包的调试,问题仍然存在。
答案 0 :(得分:0)
验证运行SSIS的帐户是否有权查询源表。对于权限不足,SSIS并不总是以您期望的方式出错。
我最喜欢的是一个Foreach文件循环,总是返回一个空文件列表,并带有一点“无法找到路径”的警告
我猜这里有从CDC功能读取LSN的细微差别