用于重建索引的SQL脚本 - 关键字“Group”附近的语法不正确

时间:2012-04-17 09:46:41

标签: sql-server-2008

我有一个相当基本的SQL脚本来重建数据库中各种模式下的所有表索引。该脚本似乎适用于我拥有的183个索引,但返回错误消息

(183 row(s) affected)
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'Group'

任何人都可以解释原因并提供解决方案吗?

USE RedGateMonitor;
GO
declare @db varchar(150)

declare @tmp TABLE(recnum int IDENTITY (1,1), tableschema varchar(150), tablename varchar(150))
insert @tmp (tableschema, tablename)
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables where TABLE_TYPE = 'BASE TABLE'
ORDER By TABLE_SCHEMA
declare @X int, @table varchar(150), @cmd varchar(500), @schema varchar(150)
set @X = 1


While @X <= (select count(*) from @tmp) BEGIN
set @db = 'RedGateMonitor'
set @table = (select tablename from @tmp where recnum = @X)
set @schema = (select tableschema from @tmp where recnum = @X)

set @cmd = 'ALTER INDEX ALL ON ' + @db + '.' + @schema + '.' + @table +  ' REBUILD'
EXECUTE(@cmd)

set @X = @X + 1

END

1 个答案:

答案 0 :(得分:1)

我同意米奇的评论:

(1)你应该使用现有的解决方案,而不是重新发明轮子。

(2)如果您不打算遵循标识符的基本规则(例如,不使用保留字命名模式或表),则需要正确地转义它们。快速解决方法是:

set @cmd = 'ALTER INDEX ALL ON ' + quotename(@db) 
  + '.' + quotename(@schema) 
  + '.' + Quotename(@table) +  ' REBUILD;';

稍微好一点的修复方法如下,不需要#temp表或循环:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'ALTER INDEX ALL ON ' + QUOTENAME(@db) 
  + '.' + QUOTENAME(SCHEMA_NAME([schema_id])
  + '.' + QUOTENAME(name) + ' REBUILD;';

EXEC sp_executesql;

但我认为您不需要重建Red Gate数据库中所有表的所有索引。像Ola这样的脚本将帮助您更有效地重建哪些索引,重组哪些索引以及单独留下哪些索引。