If you are using partitioned tables, this may come in handy. I’ll keep it short and just post the code. Let me know if there are errors or you have improvements.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_help_partition]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[sp_help_partition]
GO
CREATE PROCEDURE dbo.sp_help_partition @OBJECT_NAME sysname = NULL
AS
-------------------------------------------------------------------------------
--
-- Proc: sp_help_partition
-- Author: Norman Kelm, Gerasus Software, (C) 2010
--
-- Like sp_help, but for partitioned table partition info.
--
-- Usage:
-- Return a list of table that are partitioned
-- EXECUTE sp_help_partition
--
-- Return the partitioning information for a table
-- EXECUTE sp_help_partition 'Production.TransactionHistory'
--
-- Revision History:
-- 08/06/2010 - 1.0 - Original version
--
-------------------------------------------------------------------------------
DECLARE @schema sysname
, @TABLE_NAME sysname
SELECT @schema = CASE WHEN PARSENAME(@OBJECT_NAME,2) IS NULL THEN 'dbo' ELSE PARSENAME(@OBJECT_NAME,2) END
, @TABLE_NAME = PARSENAME(@OBJECT_NAME,1)
IF @OBJECT_NAME IS NULL
BEGIN
-- List all paritioned tables when no paramters
SELECT DISTINCT SCHEMA_NAME(OBJECTPROPERTY(object_id, 'SchemaId')) + '.' + OBJECT_NAME(si.object_id) AS [Name]
FROM sys.partition_schemes AS ps
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
END
ELSE
BEGIN
IF EXISTS(SELECT 1
FROM sys.partition_schemes AS ps
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
AND OBJECT_ID(@OBJECT_NAME) = si.[object_id])
BEGIN
-- Borrowed from sp_help
SELECT [Name] = o.name
, [Owner] = USER_NAME(OBJECTPROPERTY(object_id, 'ownerid'))
, [Schema] = SCHEMA_NAME(OBJECTPROPERTY(object_id, 'SchemaId'))
, [Type] = substring(v.name,5,31)
, [Created_datetime] = o.create_date
FROM sys.all_objects o
, master.dbo.spt_values v
WHERE o.object_id = OBJECT_ID(@OBJECT_NAME)
AND o.type = substring(v.name,1,2) collate database_default
AND v.type = 'O9T'
SELECT COUNT(*) AS NumberOfPartitions
FROM sys.partitions p
INNER JOIN
sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
WHERE OBJECT_ID(@OBJECT_NAME) = p.[object_id]
AND i.type in (0,1) --0 = heap, 1 = clustered, skip the nonclustered for the count
SELECT [Scheme] = ps.name
FROM sys.partition_schemes AS ps
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
AND OBJECT_ID(@OBJECT_NAME) = si.[object_id]
AND si.type in (0,1) --0 = heap, 1 = clustered, skip the nonclustered for the count
SELECT [Function] = pf.name
, [Type] = pf.type_desc
, [fanout] = pf.fanout
, [boundary_value_on_right] = pf.boundary_value_on_right
, [create_date] = pf.create_date
, [modify_date] = pf.modify_date
FROM sys.partition_functions AS pf
INNER JOIN
sys.partition_schemes AS ps
ON ps.function_id = pf.function_id
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
AND OBJECT_ID(@OBJECT_NAME) = si.[object_id]
AND si.type in (0,1) --0 = heap, 1 = clustered, skip the nonclustered for the count
SELECT [Function Parameters] = pf.name
, [parameter_id] = pp.parameter_id
, [Type] = st.name
, pp.max_length
, pp.precision
, pp.scale
, pp.collation_name
FROM sys.partition_parameters AS pp
INNER JOIN
sys.partition_functions AS pf
ON pf.function_id = pp.function_id
INNER JOIN
sys.partition_schemes AS ps
ON ps.function_id = pf.function_id
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
INNER JOIN
sys.types AS st
ON pp.system_type_id = st.system_type_id
AND OBJECT_ID(@OBJECT_NAME) = si.[object_id]
AND si.type in (0,1) --0 = heap, 1 = clustered, skip the nonclustered for the count
SELECT [Function Range Values] = pf.name
, prv.boundary_id
, prv.value
FROM sys.partition_range_values AS prv
INNER JOIN
sys.partition_parameters AS pp
ON prv.function_id = pp.function_id
ANd prv.parameter_id = pp.parameter_id
INNER JOIN
sys.partition_functions AS pf
ON pf.function_id = pp.function_id
INNER JOIN
sys.partition_schemes AS ps
ON ps.function_id = pf.function_id
INNER JOIN
sys.indexes AS si
ON ps.data_space_id = si.data_space_id
INNER JOIN
sys.types AS st
ON pp.system_type_id = st.system_type_id
AND OBJECT_ID(@OBJECT_NAME) = si.[object_id]
AND si.type in (0,1) --0 = heap, 1 = clustered, skip the nonclustered for the count
ORDER BY
prv.boundary_id
SELECT tc.CONSTRAINT_NAME
, cc.CHECK_CLAUSE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
JOIN INFORMATION_SCHEMA.CHECK_CONSTRAINTS AS cc
ON tc.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
AND tc.CONSTRAINT_SCHEMA = cc.CONSTRAINT_SCHEMA
WHERE tc.TABLE_SCHEMA = @schema
AND tc.TABLE_NAME = @TABLE_NAME
AND tc.CONSTRAINT_TYPE = 'CHECK'
END
ELSE
BEGIN
DECLARE @error NVARCHAR(255)
SELECT @error = @OBJECT_NAME + ' is not partitioned!!!'
RAISERROR (@error, 16, 1)
END
END
GO