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