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

像这样的东西:

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

但对于索引。

你可以使用一个简单的select,如下所示:

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

AdaTheDEV,我用你的语法,并创build了以下,为什么。

问题:由于缺less索引,stream程每个季度需要一个小时运行一次。

更正:更改查询过程或过程检查索引,并创build它,如果缺less…相同的代码被放置在查询和过程的最后,以删除索引,因为它不需要,但季度。 在这里只显示拖放语法

 -- 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 

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

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

如果索引存在,IndexProperty将返回一个Id,如果不存在,则不会。

然而,与原始问题略有偏差可能对未来登陆这里希望DROPCREATE索引的人员有所帮助,例如在部署脚本中。

你可以绕过存在的检查只需添加以下内容到您的创build语句:

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

在这里阅读更多: CREATE INDEX(Transact-SQL) – DROP_EXISTING子句

NB正如在评论中提到的那样,该子句的索引必须已经存在,而不会抛出错误。

写下面的函数,使我能够快速检查索引是否存在; 像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,但是这不是非常有用的。

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

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

你可以使用如下的UDF:

 IF (SELECT [dbo].[Index_Exists] (N'SchemaName', N'TableName', N'IndexName')) = 0 BEGIN -- Your script END 

这个函数确保你引用的索引是正确的,因为它们可以为不同的模式使用相同的索引和/或表名:

 CREATE FUNCTION [dbo].[Index_Exists] (@Schema_Name sysname, @Table_Name sysname, @Index_Name sysname) RETURNS bit WITH EXECUTE AS CALLER AS BEGIN DECLARE @Output bit SET @Schema_Name = ISNULL(@Schema_Name, N'dbo'); IF EXISTS ( SELECT * FROM sys.indexes ind JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id JOIN sys.tables t ON ind.object_id = t.object_id WHERE @Table_Name = t.[name] AND @Schema_Name = OBJECT_SCHEMA_NAME(t.[object_id]) AND @Index_Name = ind.[name] ) SET @Output = CAST(1 as bit) RETURN ISNULL(@Output,CAST(0 as bit)) END