18

重複の可能性:
SQL Server DB のすべてのインデックスとインデックス列のリスト

列名に基づいて、特定のテーブルのインデックスが SQL Server データベースに存在するかどうかを確認する方法があるかどうかを知りたいです。

次のスクリプトを実行するとします。

  CREATE NONCLUSTERED INDEX [MyIndexName]
  ON [dbo].[MyTable] ([CustomerId])
  INCLUDE ([Id],[ModificationDate],[ProductId])
  GO

ここで、実際のインデックス名ではなく、テーブル名と列 (および include 句の列) に基づいてインデックスが存在するかどうかを確認したいと思います。

(SQL Server 2008 R2)

ありがとう

4

2 に答える 2

34

このクエリを試してください:

if exists(
           SELECT 1 
           FROM sys.indexes 
           WHERE name = 'INDEX' 
           AND object_id = OBJECT_ID('TABLENAME')
          )
 begin
 ....
 end
于 2012-11-13T14:17:44.773 に答える
0

情報は、次の行に沿ったカタログ メタデータ ビューで利用できます。

select ...
from sys.indexes i
join sys.index_columns ic on i.object_id = ic.object_id
    and i.index_id = ic.index_id
join sys.columns c
    on ic.object_id = c.object_id
    and ic.index_column_id = c.column_id
where i.object_id = object_id('MyTable')
and (c.name = 'CustomerId' and ic.key_ordinal = 1 and ic.is_descending_key = 0)
or (ic.is_included_column = 1 and c.name in ('Id', 'ModificationDate', 'ProductId'));

これは、はい/いいえの答えを生み出すのではなく、計画しているインデックスをすでにカバーしている可能性のあるインデックスを示しています。キーの位置、キーの方向、および含まれる列の両方をカバーする必要があります ((K1、K2) のインデックスは (K1) をカバーし、(C1、C2、C3) を含むインデックスは (C1、C3) をカバーします)。 . 実際の運用システムでは、暗黙的に含まれる列 (クラスター化されたインデックス キーなど)、インデックス フィルター式、インデックス データ領域の違い (パーティション化など) などを考慮する必要があります。

于 2012-11-13T14:42:19.617 に答える