从 SQL 代理运行时 SSIS 脚本任务失败

Posted

技术标签:

【中文标题】从 SQL 代理运行时 SSIS 脚本任务失败【英文标题】:SSIS Script Task Fails when run from SQL Agent 【发布时间】:2015-03-26 14:28:50 【问题描述】:

我已经删除并重写了这个问题,因为我认为我没有说清楚,这引起了一些挫败感。

我有一个创建和填充 Excel 工作表的 SSIS 包,该包完美运行并根据需要创建文件,并且可以从 SQL Server 代理按计划执行,没有任何问题。

当我尝试执行一个脚本任务时,问题就出现了,该任务执行一些 VB 脚本以删除 excel 文件中的特定行。

Public Sub Main()
    '


    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet

    xlApp = New Excel.Application
    xlApp.Workbooks.Open(Dts.Variables("NewFileName").Value.ToString)
    xlSheet = xlApp.Workbooks(1).ActiveSheet


    xlSheet.Rows(4).Delete()

    xlApp.Workbooks(1).Save()
    xlApp.Workbooks(1).Close()
    xlSheet = Nothing

    '
    Dts.TaskResult = ScriptResults.Success
End Sub

现在它可以在 BIDS 环境中完美运行,并且完全符合我的需要。但是,一旦部署了包,作业就会失败并给出错误

来源:删除标题行说明: System.Reflection.TargetInvocationException:已引发异常 通过调用的目标。 ---> System.Runtime.InteropServices.COMException (0x800A03EC):微软 Excel 无法访问文件 'G:\Folder\Folder1\Status 文件\Status26032015.xls'。有几个可能的原因: ?这 文件名或路径不存在。 ?该文件正在被另一个人使用 程序。 ?您尝试保存的工作簿与 当前打开的工作簿。

包以 ServerName\Administrator 的形式执行,它确实可以访问 G:(因为它在创建文件时会失败,因为这是使用相同的变量完成的)。我检查过的所有文章都指向 SQL Server 代理权限,但是由于 90% 的工作都在运行,其中包括在 G 驱动器中创建一个文件,它肯定必须具有访问权限。

【问题讨论】:

由于您在该 SSIS 包中创建 excel 文件,当您进入下一步并尝试删除该行时,连接是否可能没有被破坏?即创建 excel 文件并填充它的任务在第二个任务开始并尝试连接到新的 excel 文件时仍保持连接。你能把这个过程分成两个不同的包,以便在建立行删除连接之前清理连接吗? @william-salzman 已经尝试将脚本任务分离到一个单独的包中,甚至创建了一个批处理脚本来杀死任何可能正在运行但仍然出现错误的 excel.exe 如果你登录服务器并以自己的身份运行包,它可以工作吗? 另外,如果创建第二个包。哎呀,您可以复制粘贴现有的包,但禁用除删除脚本之外的所有内容。在原始版本中,禁用删除脚本。正如您所说,原件应该从代理运行得很好。然后通过代理运行删除脚本包,是否有效? @WilliamSalzman 如果我仔细阅读您的评论,我本可以节省一些打字... 【参考方案1】:

尝试在运行 SQL 代理作业的服务器上添加此文件夹; C:\Windows\SysWOW64\config\systemprofile\Desktop

它解决了我面临的类似问题。

更多信息在这里:https://social.msdn.microsoft.com/forums/sqlserver/en-US/34e5596a-4d02-4499-8a4e-8dad9fa27528/ssis-2008-r2-script-task-fails-when-run-as-job

【讨论】:

非常感谢您。存在这样的错误绝对是疯狂的!非常感谢!!!【参考方案2】:

SQL Server 代理进程将无法转换任何映射的驱动器,例如G:\

我相信这是因为它没有启动完整的 Windows 会话,也没有加载用户的配置文件。

我会将驱动器号引用转换为 URI 格式,例如\\myserver\fileshare

【讨论】:

嗨 Mike,它不是映射驱动器,而是运行 SSIS 包的服务器上的驱动器。该包运行良好,直到脚本任务组件,其中包括在 G: 中创建一个新文件:

以上是关于从 SQL 代理运行时 SSIS 脚本任务失败的主要内容,如果未能解决你的问题,请参考以下文章

从SQL Server代理作业步骤调用时,SSIS包不会运行

从 SSIS 运行 SQL 代理作业

使用pat文件自动运行SSIS

使用 SQL 代理运行 SSIS 包时出现问题 - 因“DTSER_FAILURE(1)”而失败

SQL Server 代理作业不执行 SSIS 包权限错误

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误