我使用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
'GO'是** NOT ** T-SQL命令 - 因此您不能在从PowerShell执行的T-SQL语句中使用它。 'GO'是SQL Server Management Studio使用的**批分隔符**。你需要把这个语句分解成几个单独的语句,然后逐个执行它们 –
除了@marc_s答案,你实际上并不需要该代码中的任何一个GO语句。一条USE语句可以直接由SELECT语句直接跟踪。 –