2017-01-23 96 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