2017-01-10 6 views
1

さまざまなテーブルのインデックスを維持するためのストアドプロシージャを作成しようとしています。私は、インデックス名を取得できていますが、ALTER INDEX文でその名前を使用することができません:私は、インデックスをパラメータ化する方法をALTER INDEXでインデックス名を変更する

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

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 

問題は、私はエラーを取得するということです名?

+0

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

+0

はなぜ車輪の再発明していますか? http://ola.hallengren.com –

+0

お返事いただき、ありがとうございました。 – Russ

答えて

1

があなたのエラーを解決するためのactivites Index再建など、またはあなたは、メンテナンスのほとんどの世話をするhttps://ola.hallengren.com/スクリプトを使用することができます再編成のための動的SQL

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

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

が必要動的SQLを使用してクエリをビルドして実行する必要があります。

しかし、他の人がよくテストして使用しているスクリプトをリサーチすることをお勧めします。彼らはあなたがまだ実行していないかもしれないより多くのシナリオを扱います(デフォルト以外のスキーマのテーブル、vs rebuildの再編成時期など)。

始めるための一つ:https://blogs.msdn.microsoft.com/joaol/2008/01/28/script-to-appropriate-rebuildreorganize-database-indexes-sql-server-2005/

1

あなたは、データベースの保守作業、あなたがよ

関連する問題