Powershell SQL Server代理CmdExec作业步骤多行代码

时间:2018-03-19 09:18:45

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

为什么这样的代码在PowerShell ISE中执行:

$var = 'dog';Invoke-SqlCmd -ServerInstance 'servername' -Query "insert into DB.dbo.tbl values ('$($var)')"

但是在SQL Server Agent中不作为CmdExec作业步骤?尽管按照惯例附上它。我相信这是多个查询,因为个别查询工作

powershell.exe -ExecutionPolicy Bypass -Command {$var = 'dog';Invoke-SqlCmd -ServerInstance 'servername' -Query "insert into DB.dbo.tbl values ('$($var)')"}

TL; DR;

我有一个带有CmdExec步骤的SQL Server代理作业。我希望分配一个变量,然后在插入语句中使用它。

到目前为止,以下插入内容将起作用:

powershell.exe -ExecutionPolicy Bypass -Command "Invoke-SqlCmd -ServerInstance 'servername' -Query 'insert into DB.dbo.tbl values (''cat'')'"

这会插入一只猫。现在我需要一只狗,这就是:

powershell.exe -ExecutionPolicy Bypass -Command "$var = 'dog'; Invoke-SqlCmd -ServerInstance 'servername' -Query ""insert into DB.dbo.tbl values (''$($var)'')"""

这里有两个问题,我在其他作业中成功使用逗号终止符来分隔命令。第二个问题是逃避双引号。我知道他们需要将变量处理成字符串。

我试过用双引号以及其中一个`来逃避。我还尝试将变量声明分成一个服务器代理作业步骤,并在另一个中使用该变量。

基于下面的@gvee答案,我将代码放在脚本块中,该脚本块在PowerShell中完美执行,但不是作为SQL代理CmdExec作业步骤

powershell.exe -ExecutionPolicy Bypass -Command {$var = '''dog'''; Invoke-SqlCmd -ServerInstance 'servername' -Query "insert into DB.dbo.tbl values ($($var))"}

注意我必须将变量三次转义,这些变量插入到表格中,作为' dog'包含引号。我从insert语句中删除了单引号,但我无法将其作为CmdExec步骤在Server Agent中运行

1 个答案:

答案 0 :(得分:0)

-Command接受一个ScriptBlock,所以给它一个旋转:

powershell.exe -ExecutionPolicy Bypass -Command {
    Invoke-SqlCmd -ServerInstance "servername" -Query "insert into DB.dbo.tbl values ('cat')"
}