USE master;
GO

IF OBJECT_ID ('sp_AllocationMetadata') IS NOT NULL
	DROP PROCEDURE sp_AllocationMetadata;
GO

CREATE PROCEDURE sp_AllocationMetadata
(
	@object VARCHAR (128) = NULL
)
AS
SELECT
	OBJECT_NAME (sp.object_id) AS [Object Name],
	sp.index_id AS [Index ID],
	sa.allocation_unit_id AS [Alloc Unit ID],
	sa.type_desc AS [Alloc Unit Type],
	'(' + CONVERT (VARCHAR (6),
		CONVERT (INT,
			SUBSTRING (sa.first_page, 6, 1) +
			SUBSTRING (sa.first_page, 5, 1))) +
	':' + CONVERT (VARCHAR (20),
		CONVERT (INT,
			SUBSTRING (sa.first_page, 4, 1) +
			SUBSTRING (sa.first_page, 3, 1) +
			SUBSTRING (sa.first_page, 2, 1) +
			SUBSTRING (sa.first_page, 1, 1))) +
	')' AS [First Page],
	'(' + CONVERT (VARCHAR (6),
		CONVERT (INT,
			SUBSTRING (sa.root_page, 6, 1) +
			SUBSTRING (sa.root_page, 5, 1))) +
	':' + CONVERT (VARCHAR (20),
		CONVERT (INT,
			SUBSTRING (sa.root_page, 4, 1) +
			SUBSTRING (sa.root_page, 3, 1) +
			SUBSTRING (sa.root_page, 2, 1) +
			SUBSTRING (sa.root_page, 1, 1))) +
	')' AS [Root Page],
	'(' + CONVERT (VARCHAR (6),
		CONVERT (INT,
			SUBSTRING (sa.first_iam_page, 6, 1) +
			SUBSTRING (sa.first_iam_page, 5, 1))) +
	':' + CONVERT (VARCHAR (20),
		CONVERT (INT,
			SUBSTRING (sa.first_iam_page, 4, 1) +
			SUBSTRING (sa.first_iam_page, 3, 1) +
			SUBSTRING (sa.first_iam_page, 2, 1) +
			SUBSTRING (sa.first_iam_page, 1, 1))) +
	')' AS [First IAM Page]	
FROM
	sys.system_internals_allocation_units AS sa,
	sys.partitions AS sp
WHERE
	sa.container_id = sp.partition_id
AND sp.object_id =
	(CASE WHEN (@object IS NULL)
		THEN sp.object_id
		ELSE OBJECT_ID (@object)
	END);
GO

EXEC sys.sp_MS_marksystemobject sp_AllocationMetadata;
GO

--USE AdventureWorks;
--GO
--EXEC sp_AllocationMetadata 'HumanResources.Employee';
--GO
