'SRVR' 未定义脚本变量

'SRVR' scripting variable not defined

我有一个 powershell 脚本,它获取一堆 sql 文件并在服务器上执行它们。在我开始使用脚本删除和重新创建作业之前,一切都很好 运行。

不断抛出错误的sql脚本部分是:

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'DatabaseIntegrityCheck - SYSTEM_DATABASES', 
        @step_id=2, 
        @cmdexec_success_code=0, 
        @on_success_action=3, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'CmdExec', 
        @command=N'sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d DBAdmin -Q "EXECUTE [ola].[DatabaseIntegrityCheck] @Databases = ''SYSTEM_DATABASES, -tempdb'', @LogToTable = ''Y''" -b', 
        @flags=0

错误是:

'SRVR' scripting variable not defined

这让我相信它不喜欢这个特定的部分:

@command=N'sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d DBAdmin -Q "EXECUTE [ola].[DatabaseIntegrityCheck] @Databases = ''SYSTEM_DATABASES, -tempdb'', @LogToTable = ''Y''" -b', 

有趣的是,如果我将 sql 脚本复制并粘贴到 SSMS 中并执行它,它就可以正常工作。

为什么只有从 Powershell 执行时才会出现此错误?


运行 sql

的 powershell
try
        {
            Invoke-Sqlcmd  -ServerInstance $ServerName `
                -Database DBAdmin `
                -InputFile  $f.FullName `
                -QueryTimeout 30 `
                -ErrorAction Stop
        }
        catch
        {
            Write-Host "File:" $f.FullName 
            Write-Error $_.Exception.Message
        }

DisableVariables switch 添加到 Invoke-Sqlcmd 以便 SQL 代理脚本变量不会被解释为 SQLCMD 变量:

try
    {
        Invoke-Sqlcmd  -ServerInstance $ServerName `
            -Database DBAdmin `
            -InputFile  $f.FullName `
            -QueryTimeout 30 `
            -ErrorAction Stop `
            -DisableVariables
    }
    catch
    {
        Write-Host "File:" $f.FullName 
        Write-Error $_.Exception.Message
    }