WITH cte AS
(
SELECT t.name AS Table_Name
, t.object_id
, i.index_id
, i.type
, i.type_desc
FROM sys.indexes i
INNER JOIN sys.tables t
ON i.object_id = t.object_id
WHERE t.is_ms_shipped = 0
AND i.is_disabled = 0
AND i.is_hypothetical = 0
AND i.type <= 2
), cte2 AS
(
SELECT *
FROM cte c
PIVOT (count(type) for type_desc in ([NONCLUSTERED])) pv
)
SELECT c2.table_name AS TableName
, MAX(p.rows) AS Rows
, CASE WHEN (OBJECTPROPERTY(c2.object_id,'TableHasClustIndex') = 1) THEN
'HEAP'
ELSE
'CLUSTERED'
END AS TableType
, sum([NONCLUSTERED]) AS NumOfNonClusteredIndexes
FROM cte2 c2
INNER JOIN sys.partitions p
ON c2.[object_id] = p.[object_id]
AND c2.index_id = p.index_id
GROUP BY table_name, c2.object_id
Davide Mauri wrote a nice script, I have done similar work without using CTE. So I really liked the script; I notice in his comments Rob suggested using OBJECTPROPERTY. I haven’t used the function much, but just to get use to it I have re-write Davide’s script using Object Property and reformatted the code to my style ;-). I like Davide’s script, because when it comes to T-SQL coding, I am fairly week. So it was nice seeing an example double CTE + Pivot table :D.
Reference
- SQLBlog.Com. Davide Marui. Find all the tables with no indexes at all. Link.