空字符串导致 "Errors were detected in the command line arguments, please make sure all arguments are set correctly"

Empty string results in "Errors were detected in the command line arguments, please make sure all arguments are set correctly"

在 SQL 2016 服务器上,我有一个调用 SSIS 包的作业。该包位于 SSISDB 的项目中并且具有参数。其中一个参数是默认为空白的字符串类型。

我运行这个参数为空值的作业,它运行成功了。

然后我打开作业属性,转到调用该包的步骤并进入配置并为该参数赋值。

我再次 运行 作业,它 运行 成功,参数值对结果有预期的影响。

现在我想修改作业并将参数设置回空字符串。重复我上面所做的,我打开配置并完全删除参数的值。

然后,当我尝试保存作业步骤属性时,我收到一个错误对话框,并在我的主题行中显示消息。

如果我为该参数放回一个非空值,则可以保存作业步骤。

当我第一次创建作业时,我能够使用该值的空字符串来保存它。只是当我将值更改为非空字符串,运行 作业,然后尝试将其更改回空时,我遇到了这个错误。

我知道我可以 运行 更改作业脚本或删除并重新创建作业步骤来解决此问题。我不想知道如何解决这个问题。

我的问题是:这是一个已知错误,还是有技巧可以使用 GUI 将要执行的参数值从字符串值更改为空字符串?

你们谁能做到,或者我的问题可以重现吗?到目前为止,我在搜索中一无所获。

编辑:根据 Aaron 的评论,我尝试为参数值输入一对单引号。作业接受并成功保存。但是当我 运行 作业时,这对单引号被字面上用作参数的值,而不是空字符串。

这些问题在 Microsoft Connect 网站上发布了 2 次。

  • 它第一次被标记为已修复,因为用户选择使用变通方法,即传递白色 Space 然后将其从包中删除。 Read more
  • 第二次标记为"Won't fixed"因为微软团队正在关注其他问题Read more

MSDN network 上也提出了类似的问题,并通过解决方法解决了。

看来这是一个软件bug,目前还没有解决。您可以使用解决方法。

与您的情况相比,我对我们注意到的内容进行了一些澄清:

When I then try to save the Job Step properties, I get an error dialog with the message in my subject line.

If I put a non-empty value back in for that parameter, the job step can be saved.

我们注意到,如果您在收到错误消息后单击“取消”,SQL服务器仍会保留对您的作业配置的更改,但它会被损坏 .您可以通过以下方式查看它保存在 msdb 中的确切命令:

EXEC msdb.dbo.sp_help_jobstep @job_id=N'<job guid>', @step_id=<step>

它保留了以下形式的参数自变量:

... /Par "\"$Project::paramName\""; /Par...

这将导致 SQL 服务器代理在作业开始时失败:

Argument ""$Project::paramName";" for option "parameter" is not valid.

这是一场噩梦,因为 UI 中的一切看起来都很好,但作业失败了。如果您随后继续重新打开配置 UI 编辑器并单击确定,将保留正确的命令(即将从命令中删除该参数)并且作业将 运行 正确。

以上版本已观察到:

Microsoft SQL Server 2014 (SP2-GDR) (KB3194714) - 12.0.5203.0 (X64) Sep 23 2016 18:13:56 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ).

我已经测试并观察了这个错误的行为,以下对我有效: 1. 为您的参数设置空字符串的设计时默认值。 2. 根据需要配置作业和参数值,但不要覆盖空白参数的值(保持原样)。它应该在配置面板中以斜体显示值 "NULL"。 3. 保存作业,大功告成。

处理空白值的唯一方法是确保它基于您的设计时默认值,并且不要用空白字符串覆盖。如果您尝试使用空值覆盖参数,它会将作业脚本的命令文本配置为包含空参数值,如果您手动编写创建脚本,这将导致作业脚本无法保存或作业失败工作陈述。如果您的参数仅用于在 WHERE 子句中进行比较,那么您可以传递 space 而不是空白,除非您的比较逻辑涉及将您的值转换为二进制,其中 white-space字符会产生影响。

我已经通过在 SSMS 版本 17.9.1 上测试的这个解决方法解决了问题

将值改回空字符串,然后单击 "Next" 按钮转到下一步。

然后可以无误地保存作业。

我在尝试使用以下方法将空字符串放入变量时遇到了类似的问题 DTEXEC。对我有用的是将文字值转换为 expression 计算结果为空字符串。我用了TRIM(" ")。所以在导航之后 转义字符的混乱,我最终得到了这样的东西:

DTEXEC /SERVER . /ISSERVER "\SSISDB\MyFolder\MyProject\MyPackage.dtsx" /SET \Package.Variables[User::StringVar].EvaluateAsExpression;True /SET \Package.Variables[User::StringVar].Expression;""TRIM(\"" \"")"" 

在设置作业步骤值之前,在 Integration Services Catalog 中的 Set Parameter Value window 中配置包。

为此,请转至 Integration Services Catalog -> Folder -> Project -> Package -> 右键单击​​:Configure。在编辑值框中设置空字符串:

您可以在之后的作业步骤参数中设置空字符串。

存储过程 sp_update_jobstep 对我有用 - 编写作业脚本并使用删除的参数值更新步骤。

Before: @command=N'/ISSERVER ""\SSISDB\MyFolder\MyProject\MyPackage.dtsx"" /SERVER MyServer /ENVREFERENCE 109 /Par MyParm;""CBSLoad_Daily"" /Par ""$ServerOption::LOGGING_LEVEL(Int16)"";1 /Par ""$ServerOption::SYNCHRONIZED(Boolean)"";True /CALLERINFO SQLAGENT /REPORTING E'

EXEC msdb.dbo.sp_update_jobstep 
     @Job_name = N'MyJob'
   , @Step_name = N'MyJobStep'
   , @Step_id = 2
   , @Command =
   N'/ISSERVER "\"\SSISDB\MyFolder\MyProject\MyPackage.dtsx\"" /SERVER MyServer /ENVREFERENCE 109 /Par MyParm; /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'

我在使用带有 SSMS 18.11.1 的 SQL Server 2019 时遇到错误,同时尝试安排一个 SSIS 包,该包具有带有特殊字符的长强密码(类似于“kCkPav`LGY8PYD>W#g' +4PE*").

我通过使用中间只有一个破折号作为特殊字符的某种不那么神秘的密码解决了这个问题,但仍然足够长和强大(例如“m6sq43RxqyunLs3-AzcrGWM”)。这里: