Sql-Server

SSIS 執行的 SQL 代理作業失敗,並顯示“指定了無效的報告選項。只允許 E、W、I、C、D、P、V 和 N。”

  • October 3, 2019

具有 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。命令行參數無效。步驟失敗。

如果作業步驟上的配置選項卡用於設置包參數並且其中一個參數(例如密碼)包含需要分隔的字元(例如單引號),則可能會出現此錯誤。在作業步驟對話框中修改參數時,參數將包含在作業步驟的命令行中,並且不會分隔單引號或雙引號。這將導致無效(或更糟,錯誤)的命令行。

可能的解決方案是:

  • 刪除作業步驟,創建新作業步驟,並直接在 SSIS 項目上設置包參數(在 SSMS 中,在 Integration Services、SSISDB、SSIS 包、項目下)。作業步驟的命令行不會嘗試傳遞參數,但包執行引擎會直接讀取參數並更好地處理特殊字元。
  • 可能(但我沒有測試過)在特殊字元之前包含反斜杠分隔符。所以對於 My’Pa 的密碼

$$ word you would instead use My'Pa $$單詞。

  • 從參數中刪除有問題的特殊字元(例如,如果它是密碼,則生成一個不帶任何引號的新密碼)。

我不知道所有字元會導致這個問題,但我知道單引號會導致它,我認為假設雙引號也會導致它是安全的。

您可以通過執行以下查詢來查看 SQL 代理將執行什麼命令:

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>'

/Par預設情況下,該命令將包含幾個for$ServerOption::LOGGING_LEVEL$ServerOption::SYNCHRONIZE,但如果修改了作業步驟中的任何參數,您還將在命令行中看到它們,例如:

/Par "\"SQLServer_Password\"";"\"PLAIN_TEXT_PASSWORD\""

請注意,對於密碼欄位,密碼以純文字形式儲存在 sysjobsteps 中,因此這絕對不是您希望在作業步驟中更改的內容。

可能還有其他問題可能導致無效命令錯誤,歡迎任何人編輯此答案以添加任何其他問題。

引用自:https://dba.stackexchange.com/questions/250217