我使用T-SQL
命令找到here来获取数据库表的碎片。当我在Management Studio中执行T-SQL
时,一切正常。如果我在PowerShell
中使用它,我会收到以下错误:
这是我的脚本中引发错误的部分
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
}
这就是错误(翻译自德语):
使用0 Argument(s)调用“ExecuteReader”时发生异常: “'GO'附近的语法不正确。 'GO'附近的语法不正确。“ 在Zeile:17 Zeichen:6 + $ Result = $ cmd.ExecuteReader() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:SqlException
为什么会出现此错误?
我用来执行此操作的用户具有sysadmin
,db_ddladmin
和db_owner
权限。
编辑:另一个T-SQL
命令,用于使我的数据库的所有表在PowerShell
答案 0 :(得分:4)
GO
NOT 是一个T-SQL命令 - 因此您无法在从PowerShell执行的T-SQL语句中使用它。
GO
是SQL Server Management Studio使用的批处理分隔符。
您需要自己将该语句分解为多个单独的语句并逐个执行。