-- ================================================================== -- sys.indexes.type 0 => heap - i.e. no Primary Key -- 1 => clustered index -- 2 => non-clustered index -- ================================================================== SELECT o.object_id , schemaname = OBJECT_SCHEMA_NAME(o.object_id) , tablename = o.NAME , PrimaryKey = CASE WHEN pk.object_id IS NULL THEN 'No Primary Key' ELSE '' END , ClusteredIndexes = CASE WHEN ci.object_id IS NULL THEN 'No Clustered Index' ELSE '' END , NonClusteredIndexes = CASE WHEN nci.object_id IS NULL THEN 'No Non-Clustered Index' ELSE '' END , [RowCount] = (SELECT SUM(p.Rows) from sys.partitions AS p where p.object_id=o.object_id) / (1+COUNT(ci.object_id)+COUNT(nci.object_id)) , [IndexCount] = COUNT(ci.object_id)+COUNT(nci.object_id) FROM sys.objects o LEFT OUTER JOIN sys.indexes nci ON nci.object_id = o.object_id and nci.type=2 LEFT OUTER JOIN sys.indexes ci ON ci.object_id = o.object_id and ci.type=1 LEFT OUTER JOIN sys.indexes pk ON o.object_id = pk.object_id AND pk.is_primary_key = 1 WHERE o.Type='U' AND ((pk.object_id IS NULL) OR (ci.object_id IS NULL) OR (nci.object_id IS NULL)) GROUP BY o.object_id, OBJECT_SCHEMA_NAME(o.object_id), o.NAME, CASE WHEN pk.object_id IS NULL THEN 'No Primary Key' ELSE '' END, CASE WHEN nci.object_id IS NULL THEN 'No Non-Clustered Index' ELSE '' END, CASE WHEN ci.object_id IS NULL THEN 'No Clustered Index' ELSE '' END ORDER BY TableName ASC