我们的SSIS将一个结构化的控件包和许多从控件包调用的子包(大约30个)包装起来。使用“执行包任务”调用子包。每个子包有一个执行包任务。每个执行包任务使用文件连接管理器指定子包dtsx文件的路径。每个子包有一个文件连接管理器。每个文件连接管理器都有一个为ConnectionString属性定义的表达式。这个表达式如下所示:
@[Template::FolderPackages]+"MyPackage.dtsx"
每个包的文件名都不同。变量(FolderPackages)在SSIS包配置文件中指定。
运行时生成的错误是
加载包文件“MyPackage.dtsx”
时出错0x80070002
系统找不到指定的文件。“失败的软件包不同于运行运行,有时根本没有软件包失败。这是在完全相同的环境/数据等运行时。
我在此错误期间运行FileMon并发现错误发生时SSIS尝试从错误的位置读取dtsx文件,即从system32读取。我检查过这与@ [Template :: FolderPackages]变量为空时会发生的情况相同,但因为每个子包都使用相同的变量并且对某些子包有效但有时对其他包不起作用,我没有对这一事实的谴责。
有什么明显的,或者是时候向微软提出支持电话了吗?
答案 0 :(得分:2)
您是否直接在SSIS变量上使用表达式?每次变量被需要使用它的消费对象引用时,计算带有表达式的变量。这就是竞争条件错误存在的地方,因为如果另一个线程已经在评估另一个变量,并且变量的默认值被提供给消费者对象,有时表达式不会被评估。
如果符合您的设计,连接网站上的这两个错误会讨论问题和解决方法:
第二个在 connect.microsoft.com/SQLServer/feedback/details/406534/ssis-2008-variable-expressions-dont-always-evaluate
变通方法摘要是 { - 注意可以在SSIS控制流中运行的并行任务并使用这些表达式变量。如果你有两个并排的任务,如果每个任务依赖于同一个变量,并且该变量有一个Expression来设置它的值,那么你可以点击它。 手动序列化此类任务,以便它们不会并行运行。 IE浏览器。在控制流上添加一个绿色箭头,以便任务按顺序发生在Task1,Task2,Task3中,而不是并行路径上的并排,而不是在没有路径的同一容器内。
您可以避免使用变量表达式:使用执行相同工作的自制脚本任务以所需顺序分配局部变量,以便不使用表达式评估变量(即可以命中的事物)这种竞争条件)。换句话说,在使用之前,在控制流中的某个时间点手动分配变量值。在变量上使用表达式的关键是在使用时根据另一个值动态设置一个值,这样就可以手动实现类似的设计目标。
减少线程以最小化潜力:将数据流任务EngineThreads设置为1,将MaxConcurrentExecutables设置为1.这将有助于将程序包的执行一次分离到一个任务,但这会产生可能导致性能降低的副作用
在设计中的不同范围级别的变量的不同副本上创建和设置值,以便它们在不同的并行执行范围内进行评估,并避免对并行线程进行表达式求值。 Master :: Var1,Child1 :: Var1,Child2 :: Var1
}
答案 1 :(得分:0)
在黑暗中有点刺伤但是......
我遇到类似的问题,其中readonly = false且多个组件同时读取变量并导致锁定问题。
我一直通过运行一对数据流来重新创建问题,这些数据流除了在for循环容器中引用变量之外什么都没做,并且将变量更改为只读,这解决了问题。
如果您暂时硬编码软件包名称,这可以解决问题吗?
答案 2 :(得分:0)
将跟踪信息发送给Microsoft后,我们遇到了堆损坏。如果我们深究这个问题,我会更新这个问题。 目前的建议是禁用dtexec.exe的堆后备。
答案 3 :(得分:0)
这个问题的官方答案是它是SQL 2005和2008中的一个错误。访问同一个变量的许多任务都会导致竞争条件,而某些任务会获得表达式的默认值而不是评估值。
解决方法是确保默认值(在属性表中为您遇到问题的任何属性定义的值)应该是在生产环境中有效的值。
这样,当竞争条件发生时,SSIS将回退到包值,这仍然有效。
在开发中?好吧,你只需要手动处理它,直到我们从微软获得错误修复。
答案 4 :(得分:0)
有一篇与此问题相关的知识库文章:http://support.microsoft.com/kb/2448991说明了修复的时间和地点。