我对SSIS比较陌生。在我工作的环境中,我只能访问Dev数据库。我创建并测试包,然后将它们发送给DBA以在我们的UAT环境中执行。导入XML文件的其中一个软件包在作为SQL Server代理作业运行时间歇性地失败。这是一个问题,因为最终解决方案是用于高可靠性系统。测试负载大约为46000个文件,导入1000-2000个文件后导入失败。
信息量很大的错误信息如下所示。我做了一些研究,我可以找到这个错误的唯一信息(最好是粗略的)谈论并发问题。所以,我把最高执行次数提高到1 ......仍然是同样的问题。
Executed as user: \. Microsoft (R) SQL Server Execute Package Utility Version 9.00.4035.00 for 32-bit Copyright (C) Microsoft Corp 1984-2005. All rights reserved. Started: 2:19:57 PM. The return value was unknown. The process exit code was -1073741819. The step failed.
有人可以提出原因或解决方案吗?甚至是获取更多诊断信息的方法?
答案 0 :(得分:2)
配置程序包以在运行时捕获启用日志的事件 点击SSIS菜单 - >记录 我喜欢使用SQL Server的日志提供程序,这将创建一个名为'sp_ssis_addlogentry'的系统存储过程和一个名为'sysssislog'的表。这至少应该为您提供失败的包中的组件。
如果我必须猜测,则ScriptTask中有一个未处理的异常且任务未设置DTS.TaskResult。
DTS.TaskResult = (int)ScriptResults.Failure
尝试将ScriptTask代码包装成这样的东西(但是当你弄清楚问题是什么时,删除catch(Exception Ex))
try
{
bool fireAgain = false;
// Some Code
Dts.Events.FireInformation(0, "", "Some logable info: I Love Puppies", String.Empty, 0, ref fireAgain);
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception Ex)
{
Dts.Events.FireError(1, "", "FAILURE: " + Ex.Message, "", 0); // this will show up in the sysssislog table
Dts.TaskResult = (int)ScriptResults.Failure;
}
答案 1 :(得分:1)
您的流程是完全顺序的,还是您正在进行一些并行任务?如果存在并行任务,则可能是两个流的时间有问题(即,一个可能正在访问另一个流正在使用的数据......或者可能是SSIS无法应对的数据)。
您可以尝试将程序包的MaxConcurrentExecutables设置为1(即,在程序包运行时仅强制使用1个线程)。打开包并查看“控制流”窗口时,可以在设计器中查看/设置此属性。如果将此属性设置为1,则应该可以帮助您确定这是否是您遇到的问题类型。如果它解决了您的问题,那么您可以将其保留为该设置,或者使用您的包来尝试消除导致原始问题的并行性。
以下是MaxConcurrentExecutables标志的链接:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.package.maxconcurrentexecutables(v=SQL.90).aspx