如何查询以确定表是否具有CLUSTERED主键

时间:2014-01-16 16:40:58

标签: sql tsql primary-key clustered-index

我发现了这个问题,但它似乎没有回答这个问题......

SQL Server - How to find if clustered index exists

如何编写IF T-SQL语句来说:

IF NOT ([TableName] has a CLUSTERED PK)
   ALTER TABLE to add the CLUSTERED PK 

2 个答案:

答案 0 :(得分:10)

试试这个

IF NOT EXISTS (SELECT * 
               FROM sys.indexes 
               WHERE object_id = OBJECT_ID('dbo.MdsInventar') 
                 AND index_id = 1
                 AND is_primary_key = 1)
   ......

聚集索引总是index_id = 1.当然 - 如果你这样检查(is_primary_key = 1条件),那么总有可能存在非表上的主要聚簇索引 - 因此您将无法创建另一个聚簇索引。因此,您可能需要丢失AND is_primary_key = 1条件,并检查“是否存在聚集索引”。

更新:或者如果使用index_id = 1似乎是黑魔法,您也可以使用type列代替:

IF NOT EXISTS (SELECT * 
               FROM sys.indexes 
               WHERE object_id = OBJECT_ID('dbo.MdsInventar') 
                 AND type = 1
                 AND is_primary_key = 1)
   ......

答案 1 :(得分:2)

我不确定它是否仍然是问题,但也许它会帮助另一个人。

请在下面找到部分代码:

SELECT COL_NAME(ic.object_id,ic.column_id) AS 'column name', 
i.object_id, i.name, i.type_desc, ds.name, ds.type_desc FROM sys.indexes i
INNER JOIN sys.data_spaces ds ON i.data_space_id = ds.data_space_id 
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE i.object_id = OBJECT_ID('NameOfYourTableWithSchemaIncluded')

希望它对任何人都有帮助! 最诚挚的问候。