使用ALTER INDEX改变索引名称

时间:2017-01-10 04:07:28

标签: sql-server

我正在尝试创建一个存储过程来维护各种表的索引。我能够检索索引名称,但无法将该名称与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.

我如何参数化索引名称?

2 个答案:

答案 0 :(得分:1)

你需要动态的sql

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

exec('ALTER INDEX +'@indexName'+ ON '+@tableName+' REORGANIZE')

对于Index重建或重组等数据库维护任务,您可以使用https://ola.hallengren.com/脚本来处理大多数维护活动

答案 1 :(得分:1)

要解决您的错误,您需要使用动态SQL来构建和运行查询。

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

但是,我建议研究其他人编写的脚本,这些脚本已经过很多测试并且已经被很多人使用过了。它们处理了您可能尚未遇到的更多场景(非默认架构中的表,何时重新组织vs rebuild`等)。

一个入门:https://blogs.msdn.microsoft.com/joaol/2008/01/28/script-to-appropriate-rebuildreorganize-database-indexes-sql-server-2005/