我使用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語句直接跟蹤。 –