2012-04-17 13 views
0

データベース内のさまざまなスキーマですべてのテーブルインデックスを再構築するためのかなり基本的なSQLスクリプトがあります。スクリプトは私が持っている183のインデックスに動作しているようですが、エラーメッセージを返すインデックスを再構築するためのSQLスクリプト - 'Group'キーワードの近くの構文が正しくありません

(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 
+0

代わりにOla Hallegrenの試したスクリプトを試してみてください。http://ola.hallengren.com/ –

+2

おそらくあなたはスキーマとテーブル名を '[]'で引用していないためです。 –

答えて

1

私はミッチのコメントの両方に同意する:

(1)あなたはこのために、既存のソリューションを使用しての代わりに、車輪の再発明する必要があります。

(2)識別子の基本的な規則に従わない場合(たとえば、予約語の付いたスキーマやテーブルに名前を付けるなど)、適切にエスケープする必要があります。

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

Aわずかに良い修正が#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のようなスクリプトは、再構築するインデックス、再編成するインデックス、および単独で残すインデックスについて、より効率的になるのに役立ちます。

+0

ありがとうございました。私はOlaのスクリプトを知っていて、すべてのインデックスを再構築する必要はないので、なぜこのエラーが発生したのか分かりませんでした。再度、感謝します –

関連する問題