2012-11-13 73 views
18

可能重複:
List of all index & index columns in SQL Server DBSQL Server 2008中檢查是否存在索引

我想知道是否有一種方法來驗證是否在SQL Server數據庫中存在的索引對於基於列名稱的特定表格:

假設我運行以下腳本:

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

現在我想檢查索引是否存在基於表名和列(以及include子句中的列),而不是實際的索引名稱。

(SQL Server 2008 R2中)

感謝

+0

不確定要如何驗證。也許你可以使用[這樣的事情](http://sqlfiddle.com/#!3/7b82b/1/0) –

+1

它實際上是不同的問題的重複-http://stackoverflow.com/questions/2689766/how- do-you-check-if-certain-index-exists-in-a-table –

+5

@MichaelFreidgeim - 只有當你已經知道索引的名字時,你的鏈接問題才提供答案。表名和列名是已知的,但索引名稱(如果存在)未知。 – Zarepheth

回答

34

嘗試此查詢:

if exists(
      SELECT 1 
      FROM sys.indexes 
      WHERE name = 'INDEX' 
      AND object_id = OBJECT_ID('TABLENAME') 
     ) 
begin 
.... 
end 
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)的索引,需要考慮關鍵位置,關鍵方向和包含列, 。對於真正的生產系統,您需要考慮隱式包含的列(如聚簇索引鍵),索引過濾器表達式和索引數據空間差異(即partitioninig)。