2016-02-02 46 views
3

我正在使用powershell并使用Invoke-SqlCmd。我能够将变量传递给SQL:sqlcmd中的转义变量/ Invoke-SqlCmd

$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' 

它给了我下面的错误:

The format used to define the new variable for Invoke-Sqlcmd cmdlet is invalid. Please use the 'var=value' format for defining a new variable.

我无法找到任何sqlcmdInvoke-SqlCmd上的任何文件我应该如何正确地逃避价值。

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

回答

8

使用上

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

望着ExecutionProcessor的构造进行了反思经过调查,以下行透露,如果有一个以上的变量定义等号,它会失败的问题。

我对其他尝试使用Invoke-SqlCmd的人的建议是为了节省您的时间和精力,只需使用开放源代码Invoke-SqlCmd2即可。

微软,请修复。

0

我最近中遇到这个问题,并通过回答TheMadTechnician在取得了成功:

Replace Single Quotes in PowerShell Or Excel CSV

The answer is to create sub expressions in your string to replace ' with ''.

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 "'", "''")')"

This way when the string is expanded it will be appropriately escaped for SQL insertion.

+0

虽然这可能解决OP的问题,因为链接仅答案日后参考,请记下解决问题的组件。如果链接崩溃,答案仍然存在。 – eshirima