10

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

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

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

这让我hello按预期返回。但是,如果我有一个变量,其值包含等于(=):

$variables = @("MyVariable='aGVsbG8NCg=='") # base64 encoded 'hello'

它给了我以下错误:

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

我找不到任何sqlcmd关于Invoke-SqlCmd我应该如何正确转义值的文档。

如何转义发送到sqlcmd/的变量Invoke-SqlCmd

4

4 回答 4

15

在调查后使用一些反思

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

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

我对其他尝试使用的人的建议Invoke-SqlCmd是节省您的时间和理智,而只需使用开源替代Invoke-SqlCmd2代替。

微软,请修复。

于 2016-02-02T16:23:44.777 回答
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
于 2019-11-01T08:15:37.560 回答
2

我还发现自己需要传递一个 base64 编码的信息,其中包含那些讨厌的 '='。对我有用的是将替换标记添加到我传递给查询的变量数组中,然后在我的查询中使用 SQL 的 REPLACE 函数将我的标记替换为“=”符号。

因此,您可以将代码更新为如下所示:

$equalsSignReplacement = '[EQUALSIGN]'
$myVariable = 'aGVsbG8NCg=='
$variables = 
    "EqualsSignReplacement=$($equalsSignReplacement)",
    "MyVariable=$($myVariable.Replace('=',$equalsSignReplacement))"

Invoke-SqlCmd `
    -ServerInstance 'localhost' `
    -Database 'master' `
    -Username 'matthew' `
    -Password 'qwerty' `
    -Query 'SELECT REPLACE('$(MyVariable)','$(EqualsSignReplacement)','=') AS foo' `
    -Variable $variables

此解决方案的缺点是您需要主动使用它的应用程序。您需要提前知道哪些变量中可能包含“等号”,然后不仅更新您的 powershell 代码,还更新您的 SQL 脚本,以确保替换正确发生。

只需确保使用对变量唯一的替换标记,这样您就不会在查询中意外地将有效文本替换为“=”。

于 2019-10-01T17:25:42.440 回答
0

我最近遇到了这个问题,并成功使用了 TheMadTechnician 的答案:

替换 PowerShell 或 Excel CSV 中的单引号

答案是在您的字符串中创建子表达式以将 ' 替换为 ''。

Invoke-Sqlcmd -ServerInstance "$SQLServer" -Database "$SqlDB" -query "INSERT INTO dbo.ecca_sw_standard_2 (name, version, product_id) VALUES (N'$($CSVAppName -replace "'", "''")', N'$($CSVVersion -replace "'", "''")' , N'$($CSVAppID -replace "'", "''")')"

这样,当字符串展开时,它将被适当地转义以进行 SQL 插入。

于 2017-08-23T20:57:59.743 回答