2014-09-29 25 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