如何检查表中是否存在某个索引?

时间:2010-04-22 09:55:16

标签: sql-server

这样的事情:

SELECT
* 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'

但是对于索引。

8 个答案:

答案 0 :(得分:420)

您可以使用这样的直接选择来完成:

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')

答案 1 :(得分:79)

检测索引存在的更简洁的编码方法如下:

If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexId') Is Null

如果索引存在,IndexProperty将返回一个Id,如果它没有,它就不会。

答案 2 :(得分:67)

AdaTheDEV,我使用了你的语法并创建了以下内容以及原因。

问题:由于缺少索引,流程每季度运行一次,耗时一小时。

更正:更改查询过程或过程以检查索引并在缺少时创建它...在查询和过程结束时放置相同的代码以删除索引,因为它不是必需的,而是每季度。仅在此处显示删除语法

-- drop the index 
begin

  IF EXISTS (SELECT *  FROM sys.indexes  WHERE name='Index_Name' 
    AND object_id = OBJECT_ID('[SchmaName].[TableName]'))
  begin
    DROP INDEX [Index_Name] ON [SchmaName].[TableName];
  end

end

答案 3 :(得分:13)

与原始问题略有偏差,但对于未来登陆此处想要DROPCREATE索引的人,即在部署脚本中,可能会有用。

只需将以下内容添加到create语句中即可绕过exists检查:

CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);

在此处阅读更多内容:CREATE INDEX (Transact-SQL) - DROP_EXISTING Clause

N.B。正如评论中所提到的,索引必须已经存在才能使该子句工作而不会抛出错误。

答案 4 :(得分:6)

编写了以下函数,允许我快速检查索引是否存在;就像OBJECT_ID一样工作。

CREATE FUNCTION INDEX_OBJECT_ID (
    @tableName VARCHAR(128),
    @indexName VARCHAR(128)
    )
RETURNS INT
AS
BEGIN
    DECLARE @objectId INT

    SELECT @objectId = i.object_id
    FROM sys.indexes i
    WHERE i.object_id = OBJECT_ID(@tableName)
    AND i.name = @indexName

    RETURN @objectId
END
GO

编辑:这只返回表的OBJECT_ID,但如果索引不存在则为NULL。我想你可以设置它来返回index_id,但这不是非常有用。

答案 5 :(得分:1)

如果您的问题的隐藏目的是在使DROP到大型表之前先建立INSERT索引,那么这将非常有用:

DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]

此语法自SQL Server 2016起可用。IF EXISTS的文档:

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

答案 6 :(得分:0)

bool enabled = false;
    return InkWell(
      child: Container(
        child: Row(
          children: <Widget>[
            Padding(
              padding: EdgeInsets.only(top: 16.0, bottom: 16.0, left: 30.0),                
            ),
            Text(
              text,
              style: TextStyle(
                color: (enabled
                  ? textColor
                  : Colors.black54
                ),
                fontWeight: FontWeight.bold
              ),
            )
          ],
        ),
        decoration: BoxDecoration(
          color: (enabled
            ? background
            : Colors.transparent
          )
        ),
      ),
      onTapDown: (TapDownDetails details){
        setState(() {
          enabled = true;
        });
      },
      onTapCancel: (){
        setState(() {
          enabled = false;
        });
      },
      onTap: (){
        String r_value;
        if(text == sheetText[0]){
          r_value = "delete";
        } else if(text == sheetText[1]){
          r_value = "edit";
        } else if(text == sheetText[2]){
          r_value = "notification";
        } else {
          return;
        }
        Navigator.pop(context, r_value);
      },
    );

答案 7 :(得分:-1)

检查特定表上是否存在聚集索引:

SELECT * FROM SYS.indexes 
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')