我有一个控制流,它使用执行 SQL 任务设置用户变量。在 Visual Studio 中一切正常,但是一旦我将它部署到 SSIS 目录,变量似乎没有被分配。我正在针对完全相同的数据源执行它。
我会准确地解释发生了什么...
序列容器中的第一个任务从状态表中读取为该表记录的最后一个 LSN。如果该表没有条目,则它遵循上图中的路径1 。
在第2步,它使用源数据库上的 CDC 函数读取表的最小 LSN。然后它将 LSN 和该 LSN 的日期时间存储在两个用户变量中。这是数据复制的“窗口开始”。
步骤3从目标表中读取最大更改日期。
如果窗口开始在最新更改日期之前,则步骤4会出现分支,因为这会导致将重复数据导入到目标表中。(我只想说在加载到目标表之前我无法进行重复数据删除......)
当我在 Visual Studio 中运行项目时,一切正常。它通过步骤 1-3,然后继续进行 DFT,因为表的最小 LSN 在目标表中的最大更改日期之后。我已经使用断点来确保变量实际上被正确设置。
一旦我将项目部署到 SSIS 目录,它就会执行第 4 步并记录错误行。它似乎没有设置变量或约束表达式没有使用正确的值。我尝试在执行 SQL 任务中使用结果集和输出参数设置变量。我可以从日志消息中看到源表的最大更改日期是正确的。
一件奇怪的事情是日志消息中的变量值与设计时值不同。设计时间值为“1899-12-25 14:20:00”,但日志消息显示“1899-12-30 00:00:00”。但这可能取决于我使用了错误的转换方法或其他东西。 ..我没有仔细研究它,因为它仍然不应该遵循路径 4。
它在 Visual Studio 中按预期运行但在服务器上具有不同行为的事实让我非常困惑。我想不出是什么原因造成的。
这些包是使用 BIML 创建的,但我认为这实际上没有任何联系。完整的解决方案复制了 100 多个表,每个表一个包。即使我尝试仅对单个包进行调试部署,问题仍然存在。