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'格式来定义新变量.
我找不到在任的任何文件sqlcmd或Invoke-SqlCmd上我应该如何正确逃生值.
如何将变量发送到sqlcmd/ Invoke-SqlCmd?
经过调查后使用了一些反思
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)