代码之家  ›  专栏  ›  技术社区  ›  Ben Gracewood

SSIS间歇变量错误:系统找不到指定的文件

  •  3
  • Ben Gracewood  · 技术社区  · 15 年前

    @[Template::FolderPackages]+"MyPackage.dtsx" 
    

    每个包的文件名都不同。变量(FolderPackages)在SSIS包配置文件中指定。

    运行时期间生成的错误为

    系统找不到指定的文件。“失败的包与运行不同,有时根本没有包失败。这是在完全相同的环境/数据等上运行时发生的。

    在此错误期间,我运行了FileMon,发现当错误发生时,SSIS会尝试从错误的位置(即system32)读取dtsx文件。我检查过,这与@[Template::FolderPackages]变量为空时会发生的情况相同,但由于每个子包都使用相同的变量,并且对某些子包有效,但有时对其他子包无效,因此我无法解释这一事实。

    有什么明显的问题吗,或者是时候给微软打个支持电话了?

    5 回复  |  直到 7 年前
        1
  •  2
  •   Jason Howell    14 年前

    您是否直接在SSIS变量上使用表达式?每次需要使用变量的消费对象引用该变量时,都会计算带有表达式的变量。这就是存在争用条件错误的地方,因为有时如果另一个线程已经在计算不同的变量,则表达式不会得到计算,并且变量的默认值会提供给使用者对象。

    如果这与您的设计相符,connect站点上的这两个bug将讨论问题和解决方法:

    https://connect.microsoft.com/SQLServer/feedback/details/332372/ssis-variable-expressions-dont-always-evaluate

    第二个在 connect.microsoft.com/SQLServer/feedback/details/406534/ssis-2008-variable-expressions-not-everys-evaluate

    { 手动将这些任务顺序化,以便它们不会并行运行。即,在控制流上添加一个绿色箭头,以便任务按Task1、Task2、Task3的顺序出现,而不是在并行路径上并排出现,也不是在没有路径的同一容器中出现。

    • 您可以避免变量表达式:使用做相同工作的自制脚本任务按所需顺序分配局部变量,这样就不会使用表达式(即,可能会遇到这种竞争条件的东西)计算变量。换句话说,在使用变量值之前,在控制流中的某个时间点手动分配变量值。在变量上使用表达式的目的是在使用另一个值时基于另一个值动态设置一个值,因此这可以实现类似的设计目标,但需要手动完成。

        2
  •  0
  •   Steve Homer    15 年前

    在黑暗中有点刺伤,但是。。。

    我遇到过一个类似的变量问题,其中readonly=false,多个组件同时读取变量并导致锁定问题。

    我始终通过运行一对数据流来重新创建问题,该数据流只在for循环容器中引用变量,并将变量更改为只读,从而解决了问题。

    如果临时硬编码程序包名称,这是否解决了问题?

        3
  •  0
  •   Ben Gracewood    15 年前

    在向Microsoft发送跟踪信息后,发现我们遇到了堆损坏。如果我们弄清楚了,我会更新这个问题。 当前的建议是禁用dtexec.exe的堆查找。

        4
  •  0
  •   Ben Gracewood    14 年前

    这个问题的官方答案是,它是SQL2005和2008中的一个bug。许多任务访问同一变量会导致竞争条件,有些任务会获得表达式的默认值而不是计算值。

    解决方法是确保默认值(在属性表中为您遇到问题的任何属性定义的值)应该是在生产环境中工作的值。

    这样,当prod中出现竞争条件时,SSI将返回到包值,该值仍然有效。

    在德夫?在我们从微软得到一个bug修复之前,你必须手动处理这个问题。

        5
  •  0
  •   David Snabel-Caunt    12 年前

    有一篇关于这个问题的知识库文章: http://support.microsoft.com/kb/2448991 说明何时何地修复了此问题。