6

SQLServerデータベース内の既存のすべてのインデックスのCREATEINDEXステートメントを一覧表示するスクリプトを持っている人はいますか?

SQL Server DBのすべてのインデックスとインデックス列のこのスレッドリストには、それらを見つける方法に関する優れたヒントがあります。しかし、ステートメントを生成するためのスクリプトはCREATE INDEX素晴らしいでしょう。適切なデータがない状況に陥ったり、ドキュメントなしで時間の経過とともにインデックスがアドホックな方法で追加されたりして、createステートメントが欠落している場合があります。ある状況のように、私は今自分自身を見つけます。

ありがとう。

4

4 に答える 4

13

[SQL Management Studioからスクリプトを生成]を使用して、[スクリプトインデックス]オプション([高度なスクリプトオプション]の下)を選択します。

于 2012-10-01T11:03:17.177 に答える
4

少し前にそのために何かを書きました。必要に応じて変更する必要があるかもしれませんが、少なくともスケルトンはあります。

if exists (select 1 from information_schema.routines where routine_name = 'Script_CreateIndex')
    drop proc Script_CreateIndex
go

create proc Script_CreateIndex (
    @TableName varchar(124)
)
as
begin
    if not exists (select 1 from sys.indexes where object_name(object_id) = @TableName and type_desc in ('CLUSTERED', 'NONCLUSTERED'))
        return

    declare @IndexList table (
        Id int identity,
        IndexName varchar(124),
        IndexDescription varchar(max),
        IndexKeys varchar(max)
    )

    insert @IndexList(IndexName, IndexDescription, IndexKeys)
        exec sp_helpindex @TableName

    if (select count(*) from @IndexList) > 0
    begin
        select '-- Creating indexes for table ' + @TableName

        while exists (select 1 from @IndexList) 
        begin
            declare @Id int, @IndexName varchar(124), @IndexDescription varchar(max), @IndexKeys varchar(max)
            select top 1 @Id = Id, @IndexName = IndexName, @IndexDescription = IndexDescription, @IndexKeys = IndexKeys from @IndexList order by Id
            delete from @IndexList where Id = @Id

            declare @Clustered varchar(10), @Unique varchar(7)

            select @Clustered = case when patindex('%nonclustered%', @IndexDescription) > 0 then '' else ' clustered ' end
            select @Unique = case when patindex('%unique%', @IndexDescription) > 0 then ' unique ' else '' end

            select 'if not exists (select 1 from sys.indexes where name = ''' + @IndexName + ''')'
            select 'begin'
            select char(9) + 'create' + @Unique + @Clustered + ' index [' + @IndexName + '] on [' + @TableName + '](' + @IndexKeys + ')'
            select char(9) + 'select ''Index ' + @IndexName + ' created.'''
            select 'end'
            select 'go'
        end

        select ''
        select ''
    end
end
go

grant exec on Script_CreateIndex to public
select 'Script_CreateIndex compiled.' 'Job'
go
于 2012-10-01T11:11:18.367 に答える
4

ここで私の解決策を確認してください: https ://stackoverflow.com/a/55742250/1831734

出力

Create                                                                                                      Drop                                    Rebuild
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE CLUSTERED INDEX [PK_Table1] ON [Table1] ( [Tab1_ID] )                                                DROP INDEX [PK_Table1] ON [Table1]      ALTER INDEX [PK_Table1] ON [Table1] REBUILD 
CREATE UNIQUE INDEX [IX_Table1_Name] ON [Table1] ( [Tab1_Name] )                                            DROP INDEX [IX_Table1_Name] ON [Table1] ALTER INDEX [IX_Table1_Name] ON [Table1] REBUILD 
CREATE NONCLUSTERED INDEX [IX_Table2] ON [Table2] ( [Tab2_Name], [Tab2_City] )  INCLUDE ( [Tab2_PhoneNo] )  DROP INDEX [IX_Table2] ON [Table2]      ALTER INDEX [IX_Table2] ON [Table2] REBUILD
于 2019-04-18T08:49:04.973 に答える
1

「オブジェクトエクスプローラ」ウィンドウを使用して、テーブルごとに実行できます。

Management StudioのIndexesフォルダーに移動し、フォルダーを強調表示して、[オブジェクトエクスプローラー]ペインを開きます。

次に、そのテーブルのすべてのインデックスを「シフト選択」できます。右クリックして「CREATE TO」スクリプトを作成すると、関連するすべてのインデックスを含むスクリプトが作成されます。

于 2012-10-01T11:12:19.230 に答える