2016-02-02 75 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