0

データベース内のさまざまなスキーマの下にあるすべてのテーブルインデックスを再構築するためのかなり基本的な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
4

1 に答える 1

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 のようなスクリプトを使用すると、どのインデックスを再構築し、どのインデックスを再編成し、どれをそのままにしておくかをより効率的に行うことができます。

于 2012-04-17T11:39:12.710 に答える