2017-01-10 32 views
1

我試圖創建一個存儲過程來維持各種表指標。我能夠檢索索引的名字,但我無法使用該名稱與ALTER INDEX語句:因人而異指數名稱與ALTER INDEX

DECLARE reorgCursor CURSOR LOCAL FAST_FORWARD FOR 
SELECT a.index_id, b.name, avg_fragmentation_in_percent 
FROM sys.dm_db_index_physical_stats (DB_ID(@MyDB), OBJECT_ID(@tableName), NULL, NULL, NULL) AS a 
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id 
WHERE 5 < avg_fragmentation_in_percent AND avg_fragmentation_in_percent <= 30 

OPEN reorgCursor 
FETCH NEXT FROM reorgCursor 
INTO @indexId, @indexName, @fragPct 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    ALTER INDEX @indexName ON @tableName 
    REORGANIZE 

    FETCH NEXT FROM reorgCursor 
    INTO @indexId, @indexName, @fragPct 
END 

CLOSE reorgCursor 
DEALLOCATE reorgCursor 

的問題是,我得到的錯誤:

Incorrect syntax near '@indexName'. Expecting ALL, ID, or QUOTED_ID. 

我怎麼可能參數指標名稱?

+0

EXEC( 'ALTER INDEX' + @indexName + 'ON' + @tablename) – artm

+0

你爲什麼要重新發明輪子? http://ola.hallengren.com –

+0

感謝大家的答案,並指出我可以使用的一些資源。 – Russ

回答

1

爲了解決你的錯誤,你會需要使用動態SQL來構建和運行您的查詢。

DECLARE @Sql NVARCHAR(5000) = N'ALTER INDEX ' + @indexName + N' ON ' + @tableName + N' REORGANIZE'; 
EXEC sp_executesql @Sql 

但是,我會建議研究別人寫的腳本,這些腳本經過很好的測試,並且已經被許多人使用。他們處理更多的場景,你可能還沒有遇到過(非默認模式中的表格,何時重組VS vs重建等)。

一個開始:https://blogs.msdn.microsoft.com/joaol/2008/01/28/script-to-appropriate-rebuildreorganize-database-indexes-sql-server-2005/

1

你需要動態SQL

set @indexName = Quotename(@indexName) 
set @tableName = Quotename(@tableName) 

exec('ALTER INDEX +'@indexName'+ ON '[email protected]+' REORGANIZE') 

對於數據庫的維護任務,如Index重建或重新組織你可以使用https://ola.hallengren.com/腳本需要的大多數保養護理activites