未定义“ SRVR”脚本变量

时间:2019-06-24 13:08:43

标签: powershell sql-server-2016 sql-agent-job

我有一个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”脚本变量未定义

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

@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
        }

1 个答案:

答案 0 :(得分:2)

DisableVariables switch添加到Invoke-Sqlcmd,以便将SQL Agent脚本变量不解释为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
    }