SSIS 执行的 SQL 代理作业失败,并显示“指定了无效的报告选项。仅允许 E、W、I、C、D、P、V 和 N。”

Ton*_*kle 2 sql-server ssis sql-server-agent

具有 SQL Server Integration Services 包步骤的 SQL 代理作业失败并显示以下消息:

以用户身份执行:DOMAIN\SQLAGENTACCOUNT。适用于 64 位的 Microsoft (R) SQL Server 执行包实用程序版本 13.0.4259.0 版权所有 (C) 2016 Microsoft。版权所有。指定的报告选项无效。仅允许 E、W、I、C、D、P、V 和 N。命令行参数无效。这一步失败了。

Ton*_*kle 5

如果作业步骤上的“配置”选项卡用于设置包参数,并且参数之一(例如密码)包含需要分隔的字符(例如单引号),则可能会发生此错误。在作业步骤对话框中修改参数时,参数将包含在作业步骤的命令行中,并且不会用单引号或双引号分隔。这将导致无效(或更糟糕的是,错误)的命令行。

可能的解决方案是:

  • 删除作业步骤,创建新作业步骤,然后直接在 SSIS 项目上设置包参数(在 SSMS 中,在“集成服务”、“SSISDB”、“SSIS 包”、“项目”下)。作业步骤的命令行不会尝试传递参数,但包执行引擎会直接读取参数并更好地处理特殊字符。

  • 可能(但我还没有测试过)在特殊字符之前包含反斜杠分隔符。因此,对于 My'Pa$$word 的密码,您可以使用 My\'Pa$$word。

  • 从参数中删除有问题的特殊字符(例如,如果它是密码,则生成一个不带任何引号的新密码)。

我不知道所有字符都会导致此问题,但我确实知道单引号会导致此问题,并且我认为可以安全地假设双引号也会导致此问题。

您可以通过运行以下查询来查看 SQL Agent 将执行什么命令:

USE msdb
SELECT t1.command FROM sysjobsteps t1
JOIN sysjobs t2 ON t1.job_id = t2.job_id
WHERE t2.name = '<SQL AGENT JOB NAME>'
Run Code Online (Sandbox Code Playgroud)

/Par默认情况下,该命令将包含几个$ServerOption::LOGGING_LEVEL$ServerOption::SYNCHRONIZE,但如果作业步骤上的任何参数被修改,您也会在命令行中看到它们,例如:

/Par "\"SQLServer_Password\"";"\"PLAIN_TEXT_PASSWORD\""
Run Code Online (Sandbox Code Playgroud)

请注意,对于密码字段,密码以纯文本形式存储在 sysjobsteps 中,因此您绝对不想在作业步骤中更改它。

可能还有其他问题可能导致无效命令错误,欢迎任何人编辑此答案以添加任何其他答案。