动态如果存在

时间:2014-09-29 13:52:46

标签: sql-server sql-server-2008-r2

我想检查条件,如果表中存在的索引然后触发存储过程,否则必须继续其他条件。

示例

 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 个答案:

答案 0 :(得分:1)

SQL没有任何问题,除了EXISTS行末尾没有关闭括号:

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

这将有效,但您可能总是找到索引而不以某种方式过滤数据。您可能希望更具体地了解要搜索的索引类型,因为SQL将创建一些默认索引。例如,如果使用主键创建表,则将为您创建聚簇索引。

如果没有添加主键,您通常会有 HEAP 类型索引,因此这可能是您要过滤的索引类型。

如果针对目标数据库运行此命令,您将看到存在的索引:

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索引,您可以排除可以按sys.indexes.index_id过滤的群集/非群集索引:

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