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