“SRVR”脚本变量未定义

DFo*_*k42 1 powershell sql-agent-job sql-server-2016

我有一个 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
Run Code Online (Sandbox Code Playgroud)

错误是:

“SRVR”脚本变量未定义

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

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

有趣的是,如果我将 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
        }
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 5

添加DisableVariables开关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
    }
Run Code Online (Sandbox Code Playgroud)