2014-09-29 22 views
0

我想檢查條件,如果表中存在索引然後觸發存儲過程,否則其他條件必須繼續。動態如果存在

IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID(@TableName) 
    BEGIN 
     execute spTest1 
    END 
ELSE 
    BEGIN 
     execute spTest2 
    END 

:在上述腳本中@TableName將在例如'tableName'單引號內的格式動態傳遞。

回答

1

有在EXISTS線的末端沒有錯SQL,除了缺少閉括號是:

IF EXISTS (SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID(@TableName)) 
    BEGIN 
     execute spTest1 
    END 
ELSE 
    BEGIN 
     execute spTest2 
    END 

這是可行的,但你可能總是找不到一個索引,而不以某種方式過濾數據。您可能希望更具體地瞭解您正在搜索的索引類型,因爲SQL將創建一些默認索引。例如,如果您使用主鍵創建表,則會爲您創建聚集索引。

如果沒有主鍵添加你通常會有一個HEAP型指數,所以這可能是指數的你正在尋找過濾類型。

如果你運行這個對你的目標數據庫,你會看到存在的指標:

你可以通過 sys.indexes.index_id過濾
select st.name, st.object_id, si.name, si. index_id, si.type, si.type_desc 
from sys.tables st 
inner join sys.indexes si on si.object_id = st.object_id 

爲了過濾HEAP索引,您可以排除聚集/非聚集索引:

  • 堆:index_id = 0
  • 集羣:index_id = 1
  • 非集羣:index_id = 2