我正在尝试创建一个存储过程来维护各种表的索引。我可以检索索引名称,但不能将该名称与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.如何参数化索引名?
发布于 2017-01-10 12:20:28
为了解决您的错误,您需要使用动态SQL来构建和运行查询。
DECLARE @Sql NVARCHAR(5000) = N'ALTER INDEX ' + @indexName + N' ON ' + @tableName + N' REORGANIZE';
EXEC sp_executesql @Sql然而,我建议研究其他人编写的脚本,这些脚本已经被许多已经存在的人很好地测试和使用。它们可以处理更多你可能还没有遇到的场景(非默认模式中的表,何时重组vs rebuild`等等)。
发布于 2017-01-10 12:19:58
您需要动态sql
set @indexName = Quotename(@indexName)
set @tableName = Quotename(@tableName)
exec('ALTER INDEX +'@indexName'+ ON '+@tableName+' REORGANIZE')对于像Index重建或重组这样的数据库维护任务,您可以使用https://ola.hallengren.com/脚本,它负责大多数维护活动
https://stackoverflow.com/questions/41560971
复制相似问题