Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 为什么即使路径错误,我的foreach循环也没有失败_Ssis_Ssis 2012 - Fatal编程技术网

Ssis 为什么即使路径错误,我的foreach循环也没有失败

Ssis 为什么即使路径错误,我的foreach循环也没有失败,ssis,ssis-2012,Ssis,Ssis 2012,我刚刚创建了ssis包。Foreach循环将源作为表达式,我希望在提供错误的源路径时它失败。相反,它成功了。我在其他任何地方都找不到对此的任何解释。验证时不应该失败吗?任何关于这件事的话都会帮助我理解 谢谢, L信息 如果没有要枚举的对象,Foreach枚举器不会失败。这是团队做出的设计决定。想象一下,要处理未发现EnumeratorType错误,在每个包中还需要做多少工作 正如您所发现的,这种选择的缺点是无效路径不会导致异常。如果没有找到与FileSpec匹配的文件,或者权限阻止帐户访问目录/

我刚刚创建了ssis包。Foreach循环将源作为表达式,我希望在提供错误的源路径时它失败。相反,它成功了。我在其他任何地方都找不到对此的任何解释。验证时不应该失败吗?任何关于这件事的话都会帮助我理解

谢谢, L

信息 如果没有要枚举的对象,Foreach枚举器不会失败。这是团队做出的设计决定。想象一下,要处理未发现EnumeratorType错误,在每个包中还需要做多少工作

正如您所发现的,这种选择的缺点是无效路径不会导致异常。如果没有找到与
FileSpec
匹配的文件,或者权限阻止帐户访问目录/文件,您也会遇到相同的情况

但是,如果您查看执行情况,SSIS会告诉您它没有找到任何东西。正如一位同事所说,“警告只是尚未长大的错误”

2008年的警告看起来像是

警告:Foreach循环容器处的0x8001C004:For-Each文件枚举器为空。For Each文件枚举器未找到任何与文件模式匹配的文件,或者指定的目录为空

在2012年,SSIDB
catalog.operation\u messages
表中的内容更为详细,但仍然表明它没有发现任何内容

FELC进程文件:警告:For Each File枚举器为空。For Each文件枚举器未找到任何与文件模式匹配的文件,或者指定的目录为空

行动 如果你不喜欢这种行为,有不同的方法可以解决它

第一种是将警告视为错误。这是一个参数,如果您不了解整个简洁性的话,可以设置为
/W
/WarnAsError
。这将把所有的警告视为错误,尽管如此,如果您的数据流中有未使用的列,但找到了文件,那么您的包仍将无法通过验证。我自己也喜欢这种方法,因为当我的包在无人看管的情况下运行时,我不希望收到警告。你对我的宽容不同。此外,这是运行SSIS包的非标准参数,知识水平较低的同事可能会在创建作业步骤中忽略该参数,因此包不会爆炸

第二是自己处理。两种直接实现是在ForEach枚举器之后有一个脚本任务,返回
Microsoft.SqlServer.Dts.Runtime.dtseSecResult.Failure
此脚本任务被ForEach枚举器内设置为True的变量禁用/启用。如果ForEach的内部从未命中,那么我们的变量永远不会设置为True,因此容器外部的脚本任务上的Disabled属性仍然为False,这样事情就会爆发

另一个想法是向ForEach枚举器添加OnWarning事件处理程序。然后需要解析
ErrorCode
/
ErrorDescription
系统变量以获得适当的值。看起来,错误代码是
-2147368956
,而描述是
,每个文件的枚举数为空。For Each文件枚举器未找到任何与文件模式匹配的文件,或者指定的目录为空。\r\n

同样,一旦发现这些警告,就需要添加代码来提高执行效率。将返回值设置为DTSEsecResult的脚本任务。失败通常是最干净的机制