sqlcmd/Invoke-SqlCmd中的转义变量

Mat*_*hew 4 windows sql-server powershell sqlcmd invoke-sqlcmd

我正在使用powershell和使用Invoke-SqlCmd.我能够将变量传递给SQL:

$variables = @( "MyVariable='hello'" )

Invoke-SqlCmd `
    -ServerInstance 'localhost' `
    -Database 'master' `
    -Username 'matthew' `
    -Password 'qwerty' `
    -Query 'SELECT $(MyVariable) AS foo' `
    -Variable $variables
Run Code Online (Sandbox Code Playgroud)

这让我回归正常hello.但是,如果我有一个包含equals(=)的值的变量:

$variables = @("MyVariable='aGVsbG8NCg=='") # base64 encoded 'hello'
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

用于为Invoke-Sqlcmdcmdlet 定义新变量的格式无效.请使用'var = value'格式来定义新变量.

我找不到在任的任何文件sqlcmdInvoke-SqlCmd上我应该如何正确逃生值.

如何将变量发送到sqlcmd/ Invoke-SqlCmd

Mat*_*hew 8

经过调查后使用了一些反思

C:\ Program Files(x86)\ Microsoft SQL Server\120\Tools\PowerShell\Modules\SQLPS\Microsoft.SqlServer.Management.PSSnapins.dll

查看ExecutionProcessor构造函数,以下几行揭示了如果变量定义中有多个等号,它将失败的问题.

我对其他任何试图使用的建议Invoke-SqlCmd都是为了节省你的时间和理智,而只是使用开源替代的Invoke-SqlCmd2.

微软,请修复.


小智 6

使用CHAR(61)替换上了等号。

$variable = "'Hello=World'"
$variables = @( "MyVariable=$($variable.replace("=","'+CHAR(61)+'"))" )

Invoke-SqlCmd -ServerInstance 'localhost' -Database 'master' -Query 'SELECT $(MyVariable) AS foo' -Variable $variables
Run Code Online (Sandbox Code Playgroud)