2017-04-11 82 views
2

我正在使用Microsoft.SqlServer.Management.SMO程序集來自動執行PowerShell中的某些數據庫任務。出於某種原因執行帶換行符的查詢似乎不起作用。但是,我也在C#中重現了完全相同的任務,它確實有效。我不確定是否存在我忽略的細微差別,或者與在PowerShell中讀取文件有什麼不同,這會導致我遇到問題。下面是所需的所有信息重現:使用換行符查詢無法在PowerShell中執行

SQL腳本(TEST.SQL):

select 
* from INFORMATION_SCHEMA.TABLES 

的PowerShell(工作):

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll' 

$server = New-Object Microsoft.SqlServer.Management.SMO.Server('serverName') 
$database = New-Object Microsoft.SqlServer.Management.SMO.Database($server, 'myDatabase') 
$setupScript = Get-Content "$PSScriptRoot\scripts\test.sql" 
$database.ExecuteNonQuery($setupScript) 

這裏的錯誤消息的PowerShell給出:

使用「1」參數調用「ExecuteNonQuery」的異常: 「數據庫'Salesforce-Neptune'的ExecuteNonQuery失敗。 「---> Microsoft.SqlServer.Management.Smo.FailedOperationException: ExecuteNonQuery數據庫'Salesforce-Neptune'失敗。---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:執行Transact時發生的 異常-SQL語句或批處理 ---> System.Data.SqlClient.SqlException:附近有語法錯誤 '選擇'

C#(確實工作):

var server = new Server("serverName"); 
var sql = System.IO.File.ReadAllText(@"D:\code\test.sql"); 
var database = new Database(server, "myDatabase"); 
database.ExecuteNonQuery(sql); 

如果我編輯我的test.sql文件並將整個查詢放在一行上,那麼我的PowerShell腳本就可以工作。什麼是dealio?

回答

2

,或者如果有在PowerShell中讀取文件中的一些奇怪的差異,是造成我的問題

我相信這是因爲Get-Content讀取文件的線陣列中的默認(就像ReadAllLines() C#IIRC)。

從V3開始,您可以使用-Raw開關來禁用此行爲,對於V2您必須使用[IO.File]::ReadAllText("file\path")

+0

啊!這正是問題所在。這就說得通了。謝謝你的幫助。 –