'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
}
我有一个 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
的 powershelltry
{
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
}