首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ALTER index更改索引名称

使用ALTER index更改索引名称
EN

Stack Overflow用户
提问于 2017-01-10 12:07:28
回答 2查看 166关注 0票数 1

我正在尝试创建一个存储过程来维护各种表的索引。我可以检索索引名称,但不能将该名称与Alter index语句一起使用:

代码语言:javascript
复制
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

问题是我得到了这个错误:

代码语言:javascript
复制
Incorrect syntax near '@indexName'. Expecting ALL, ID, or QUOTED_ID.

如何参数化索引名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-10 12:20:28

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

代码语言:javascript
复制
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/

票数 1
EN

Stack Overflow用户

发布于 2017-01-10 12:19:58

您需要动态sql

代码语言:javascript
复制
set @indexName = Quotename(@indexName)
set @tableName = Quotename(@tableName)

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

对于像Index重建或重组这样的数据库维护任务,您可以使用https://ola.hallengren.com/脚本,它负责大多数维护活动

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41560971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档