1

我对 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.

任何人都可以提出原因或解决方案吗?甚至是获取更多诊断信息的方法?

4

2 回答 2

3

配置包以在运行时捕获启用日志的事件。
单击 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;
}
于 2011-02-23T22:09:04.143 回答
1

您的流程是完全顺序的,还是有一些并行任务正在进行?如果有并行任务,则可能是两个流的时间问题(即,一个流可能正在访问另一个流正在使用的数据……或者可能是 SSIS 无法处理的东西)。

您可以尝试将包的 MaxConcurrentExecutables 设置为 1(即,在包运行时强制只使用 1 个线程)。当您打开包并查看“控制流”窗口时,您可以在设计器中查看/设置此属性。如果您将此属性设置为 1,它应该可以帮助您确定这是否是您遇到的问题类型。如果它解决了您的问题,那么您可以保留该设置,或者使用您的包来尝试消除导致原始问题的并行性。

这是 MaxConcurrentExecutables 标志的链接:http: //msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.package.maxconcurrentexecutables (v=SQL.90).aspx

于 2011-02-15T15:10:06.430 回答