14

テーブルのインデックスを再構築しようとすると:

ALTER INDEX ALL ON [dbo].[Allocations] REBUILD

それはうまくいきます。

でも電話したら

EXECUTE sp_msForEachTable 'ALTER INDEX ALL ON ? REBUILD'

同じテーブルに到達すると、次のように失敗します。

メッセージ 1934、レベル 16、状態 1、行 2
次の SET オプションの設定が正しくないため、ALTER INDEX は失敗しました: 'QUOTED_IDENTIFIER'。計算列のインデックス付きビューやインデックス、フィルター選択されたインデックス、クエリ通知、XML データ型メソッド、空間インデックス操作で使用する SET オプションが正しいことを確認します。


そして、それが同じテーブルであることを確認するには:

EXECUTE sp_msForEachTable 'print ''Rebuilding ?'';
ALTER INDEX ALL ON ? REBUILD;
PRINT ''   Done ?'''

結果は次のとおりです。

Rebuilding [dbo].[SystemConfiguration]
   Done [dbo].[SystemConfiguration]
Rebuilding [dbo].[UserGroups]
   Done [dbo].[UserGroups]
Rebuilding [dbo].[Groups]
   Done [dbo].[Groups]
Rebuilding [dbo].[UserPermissions]
   Done [dbo].[UserPermissions]
Rebuilding [dbo].[AllocationAdmins]
   Done [dbo].[AllocationAdmins]
Rebuilding [dbo].[Allocations]
Msg 1934, Level 16, State 1, Line 2
ALTER INDEX failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

私は何を間違っていないのですか?


:

EXECUTE sp_msForEachTable 'DBCC DBREINDEX(''?'')' 

正常に動作します!

4

4 に答える 4

25

引用符付き識別子の設定は、ストアド プロシージャごとに格納さsp_MSforeachtableれ、 として定義されOFFます。ONただし、再インデックスを実行する前に設定することで、これを回避できます。

create table dbo.T (
    ID int not null,
    constraint PK_T PRIMARY KEY (ID)
)
go
create view dbo.V ( ID)
with schemabinding
as
    select ID from dbo.T
go
create unique clustered index IX_V on dbo.V(ID)
go
ALTER INDEX ALL ON dbo.V REBUILD --Fine
go
exec sp_MSforeachtable  'ALTER INDEX ALL ON ? REBUILD' --Errors
go
exec sp_MSforeachtable  'SET QUOTED_IDENTIFIER ON;
ALTER INDEX ALL ON ? REBUILD' --Fine

SET QUOTED_IDENTIFIER:

ストアド プロシージャが作成されると、SET QUOTED_IDENTIFIERとのSET ANSI_NULLS設定が取得され、そのストアド プロシージャの以降の呼び出しに使用されます。


そしてもちろん、文書化されていないことに関する通常の警告を挿入するsp_MSforeachtableため、その動作が安定していることを信頼することはできません.


For DBCC DBREINDEX- すべての賭けはオフです。DBCC独自の小さな、非常にカスタマイズされたコードの世界に住んでいます。しかし、もちろん、将来の作業にも依存するべきではありません:

この機能は、Microsoft SQL Server の将来のバージョンでは削除される予定です。新しい開発作業ではこの機能を使用せず、現在この機能を使用しているアプリケーションをできるだけ早く修正してください。ALTER INDEX代わりに使用してください。

于 2012-10-01T14:01:29.167 に答える
5

には適切な設定がないため、 もSET QUOTED_IDENTIFIER ON必要です。sp_msForEachTablesp_msForEachTable

EXECUTE sp_msForEachTable 'SET QUOTED_IDENTIFIER ON; ALTER INDEX ALL ON ? REBUILD;'
于 2012-10-01T13:57:10.500 に答える
2

sp_msforeachtable は使用しないでください。オブジェクトが見つからないことが文書化されています。sys.tables を使用してテーブルのリストを反復処理する方がはるかに優れています。

DECLARE @id INT ,
    @table NVARCHAR(256) ,
    @reindex NVARCHAR(4000)
SELECT  @id = MIN(object_id)
FROM    sys.tables
WHILE @id IS NOT NULL 
    BEGIN
        SELECT  @table = QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
        FROM    sys.tables t
                INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
        WHERE   t.object_id = @id

        SELECT  @reindex = 'SET QUOTED IDENTIFIER ON; ALTER INDEX ALL ON '
                + @table + ' REBUILD;'
        PRINT @reindex --prints the reindex command
        --EXEC @reindex --uncomment to actually reindex

        SELECT  @id = MIN(object_id)
        FROM    sys.tables
        WHERE   object_id > @id
   END

例えば:

CREATE PROCEDURE dbo.sp_ForEachTable @query varchar(8000) AS

  --todo
于 2012-10-01T23:16:14.917 に答える
0

コード例にアンダースコアがありません:

だった

ELECT  @reindex = 'SET QUOTED IDENTIFIER ON; ALTER INDEX ALL ON '
                + @table + ' REBUILD;'

ELECT  @reindex = 'SET QUOTED_IDENTIFIER ON; ALTER INDEX ALL ON '
                + @table + ' REBUILD;'
于 2020-04-28T15:34:02.730 に答える