我有一个代理作业,通常由 WMI 事件触发。该作业中有一个令牌,它会自动从 WMI 事件中获取一个值并将其替换为该步骤的 Powershell 代码,例如:
$alert_wmi_state = '$(ESCAPE_SQUOTE(WMI(State)))';
Run Code Online (Sandbox Code Playgroud)
SQL 代理配置为选中所有作业响应警报设置的替换令牌,因此,当 WMI 事件触发时,替换会正常发生,并且运行的代码为:
$alert_wmi_state = '7';
Run Code Online (Sandbox Code Playgroud)
但是,该作业有可能手动运行(即右键单击,在步骤中启动作业...),并且我希望我的步骤代码能够优雅地处理此问题,因此我在步骤中进一步采用了以下逻辑:
if ($alert_wmi_state -eq ('$' + '(ESCAPE_SQUOTE(WMI(State)))')) {
...
}
Run Code Online (Sandbox Code Playgroud)
...理论是,$
从 中分离(ESCAPE_SQUOTE...
将合理地意味着这不被识别为令牌,因此不会被替换,因此测试将按字面意思读取:
if ($alert_wmi_state -eq '$(ESCAPE_SQUOTE(WMI(State)))') {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,手动运行作业时,在运行我的任何代码之前,SQL 代理总是会在该步骤中出错(无论它是配置为CmdExec作业步骤类型还是PowerShell作业步骤类型),并显示错误Variable WMI(State) not found
。
我的猜测是,这是因为替换ESCAPE_SQUOTE
发生在步骤代码实际解析/加载之前,因此代理永远不会运行该步骤。
我希望我可以有两个步骤,一个带有令牌,一个没有,并且让标记化步骤的失败操作启动非标记化步骤,但是步骤代码的重复是不可取的。
所以,我的问题是,有什么方法可以优雅地处理步骤代码中不存在步骤令牌的情况吗?
我在网上某处和 Microsoft Press 的书中读到了一个字段声明属性,可用于指示 NULL VARCHAR 值不应在叶级消耗空间,而不是每个叶消耗几个字符。
有人可以帮我确定该属性在哪里吗?
我不记得 Attribute 关键字是什么,但我记得看到它是因为保存空的 2 个字节并使其成为没有数据的 0 字节存储的价值。