2017-01-23 97 views
3

我使用T-SQL命令,我發現here可以獲取我的數據庫表的碎片。當我在Management Studio中執行T-SQL時,一切正常。如果我用它裏面PowerShell,我得到以下錯誤:SQL ExecuteReader引發「GO附近的語法錯誤」

這是我的腳本的一部分引發錯誤

foreach ($table in $tables) 
{ 
    $Data = new-object System.Data.DataTable 
    $cmd = new-object System.Data.SqlClient.SqlCommand 
    $getFragRate = " 
    -- SQL Command von Microsoft um die Index Fragmentation zu überprüfen 
    USE Logik; 
    GO 
    SELECT a.index_id, name, avg_fragmentation_in_percent 
    FROM sys.dm_db_index_physical_stats (DB_ID(N'Logik'), OBJECT_ID(N'$($table)'), NULL, NULL, NULL) AS a 
     JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id; 
    GO 
    " 
    $cmd.CommandText = $getFragRate 
    $cmd.Connection = $con 
    $Result = $cmd.ExecuteReader() 
    $Data.load($Result) 
    $Data 
} 

,這就是(德國翻譯)錯誤:

Exception when calling "ExecuteReader" with 0 Argument(s): "Incorrect syntax near 'GO'. Incorrect syntax near 'GO'." In Zeile:17 Zeichen:6 + $Result = $cmd.ExecuteReader() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SqlException

爲什麼會發生此錯誤?

我用來做這件事的用戶有sysadmin,​​和db_owner權限。

編輯:另一個T-SQL命令來獲得我的數據庫中的所有表沒有問題的工作從PowerShell

+7

'GO'是** NOT ** T-SQL命令 - 因此您不能在從PowerShell執行的T-SQL語句中使用它。 'GO'是SQL Server Management Studio使用的**批分隔符**。你需要把這個語句分解成幾個單獨的語句,然後逐個執行它們 –

+0

除了@marc_s答案,你實際上並不需要該代碼中的任何一個GO語句。一條USE語句可以直接由SELECT語句直接跟蹤。 –

回答

4

GO不是一個T-SQL命令 - 所以你不能把它從正在執行的T-SQL語句電源外殼。

GO是SQL Server Management Studio使用的批分隔符。

您需要將該語句分解爲幾個單獨的語句並逐個執行它們。

+2

謝謝!解決辦法就是忽略「GO」 – SimonS