SELECT SCHEMA_NAME(o.schema_id) AS SchemaName,
OBJECT_NAME(p.object_id) AS ObjectName,
i.[name] AS IndexName,
p.index_id AS IndexID,
p.partition_number AS PartitionNumber,
FORMAT(p.[rows], 'N0') AS [Rows],
FORMAT(a.total_pages * 8 / 1024., 'N2') AS IndexSizeMb, --doesn't include LOB
p.[data_compression_desc] AS [Compression],
CONCAT('ALTER INDEX [', i.[name], '] ON [', SCHEMA_NAME(o.schema_id), '].[', OBJECT_NAME(p.object_id), '] REBUILD PARTITION = ',
CASE WHEN EXISTS (SELECT TOP 1 1 FROM sys.partition_schemes AS ps WHERE ps.data_space_id = i.data_space_id)
THEN CAST (p.partition_number AS VARCHAR (4)) ELSE 'ALL' END,
' WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 15 MINUTES, ABORT_AFTER_WAIT = SELF)), ',
'SORT_IN_TEMPDB = ON, DATA_COMPRESSION=PAGE, MAXDOP = 8);') + CHAR(13) + CHAR(10) + 'GO' AS RebuildCommand
FROM sys.partitions AS p
INNER JOIN sys.indexes AS i ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
INNER JOIN sys.tables AS o ON i.[object_id] = o.[object_id]
INNER JOIN sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id
LEFT OUTER JOIN sys.allocation_units AS a ON p.[partition_id] = a.container_id AND a.data_pages > 0 AND a.total_pages > 0 -- B-tree only I guess
WHERE 1 = 1
-- AND i.index_id = 1
-- AND OBJECT_NAME(p.[object_id]) = ''
-- AND SCHEMA_NAME(o.[schema_id]) = ''
-- AND i.[name] = ''
-- AND p.partition_number = 0
-- AND p.[rows] > 0
ORDER BY ObjectName, PartitionNumber, IndexID;