2017-01-10 26 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

相关问题