This post details how to retrieve records using extended properties within your SQL Server database. The following SQL scripts demonstrate how to query various database objects for their associated extended properties.
Objects and Columns
SELECT
CASE
WHEN ob.parent_object_id > 0
THEN OBJECT_SCHEMA_NAME(ob.parent_object_id) + '.' + OBJECT_NAME(ob.parent_object_id) + '.' + ob.name
ELSE OBJECT_SCHEMA_NAME(ob.object_id) + '.' + ob.name
END + CASE
WHEN ep.minor_id > 0
THEN '.' + col.name
ELSE ''
END AS path
,'schema' + CASE
WHEN ob.parent_object_id > 0
THEN '/table'
ELSE ''
END + '/' + CASE
WHEN ob.type IN (
'TF'
,'FN'
,'IF'
,'FS'
,'FT'
)
THEN 'function'
WHEN ob.type IN (
'P'
,'PC'
,'RF'
,'X'
)
THEN 'procedure'
WHEN ob.type IN (
'U'
,'IT'
)
THEN 'table'
WHEN ob.type = 'SQ'
THEN 'queue'
ELSE LOWER(ob.type_desc)
END + CASE
WHEN col.column_id IS NULL
THEN ''
ELSE '/column'
END AS thing
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.objects ob ON ep.major_id = ob.OBJECT_ID
AND class = 1
LEFT OUTER JOIN sys.columns col ON ep.major_id = col.Object_id
AND class = 1
AND ep.minor_id = col.column_id
Indexes
SELECT --indexes
OBJECT_SCHEMA_NAME(ob.object_id) + '.' + OBJECT_NAME(ob.object_id) + '.' + ix.name
,'schema/' + LOWER(ob.type_desc) + '/index'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.objects ob ON ep.major_id = ob.OBJECT_ID
AND class = 7
INNER JOIN sys.indexes ix ON ep.major_id = ix.Object_id
AND class = 7
AND ep.minor_id = ix.index_id
Parameters
SELECT --Parameters
OBJECT_SCHEMA_NAME(ob.object_id) + '.' + OBJECT_NAME(ob.object_id) + '.' + par.name
,'schema/' + LOWER(ob.type_desc) + '/parameter'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.objects ob ON ep.major_id = ob.OBJECT_ID
AND class = 2
INNER JOIN sys.parameters par ON ep.major_id = par.Object_id
AND class = 2
AND ep.minor_id = par.parameter_id
Schemas
SELECT --schemas
sch.name
,'schema'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.schemas sch ON class = 3
AND ep.major_id = SCHEMA_ID
Database
SELECT DB_NAME()
,''
,ep.name
,value
FROM sys.extended_properties ep
WHERE class = 0
XML Schema Collections
SELECT SCHEMA_NAME(SCHEMA_ID) + '.' + XC.name
,'schema/xml_Schema_collection'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.xml_schema_collections xc ON class = 10
AND ep.major_id = xml_collection_id
Database Files
SELECT --Database Files
df.name
,'database_file'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.database_files df ON class = 22
AND ep.major_id = file_id
Data Spaces
SELECT --Data Spaces
ds.name
,'dataspace'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.data_spaces ds ON class = 20
AND ep.major_id = data_space_id
Users
SELECT --USER
dp.name
,'database_principal'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.database_principals dp ON class = 4
AND ep.major_id = dp.principal_id
Partition Function
SELECT --PARTITION FUNCTION
pf.name
,'partition_function'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.partition_functions pf ON class = 21
AND ep.major_id = pf.function_id
Remote Service Binding
SELECT --REMOTE SERVICE BINDING
rsb.name
,'remote service binding'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.remote_service_bindings rsb ON class = 18
AND ep.major_id = rsb.remote_service_binding_id
Route
SELECT --Route
rt.name
,'route'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.routes rt ON class = 19
AND ep.major_id = rt.route_id
Service
SELECT --Service
sv.name COLLATE DATABASE_DEFAULT
,'service'
,ep.name
,value
FROM sys.extended_properties ep
INNER JOIN sys.services sv ON class = 17
AND ep.major_id = sv.service_id
Contract
SELECT -- 'CONTRACT'
svc.name
,'service_contract'
,ep.name
,value
FROM sys.service_contracts svc
INNER JOIN sys.extended_properties ep ON class = 16
AND ep.major_id = svc.service_contract_id
Message Type
SELECT -- 'MESSAGE TYPE'
smt.name
,'message_type'
,ep.name
,value
FROM sys.service_message_types smt
INNER JOIN sys.extended_properties ep ON class = 15
AND ep.major_id = smt.message_type_id
Plan Guide
SELECT -- 'PLAN GUIDE'
pg.name
,'plan_guide'
,ep.name
,value
FROM sys.plan_guides pg
INNER JOIN sys.extended_properties ep ON class = 27
AND ep.major_id = pg.plan_guide_id
Assembly
SELECT -- 'assembly'
asy.name
,'assembly'
,ep.name
,value
FROM sys.assemblies asy
INNER JOIN sys.extended_properties ep ON class = 5
AND ep.major_id = asy.assembly_id
Certificates, Asymmetric Keys, and Symmetric Keys
Note: The following SQL queries for Certificates, Asymmetric Keys, and Symmetric Keys require the `class` values to be filled in for accurate results. You can find these values in the reference table below.
--UNION ALL
SELECT --'CERTIFICATE'
cer.name,'certificate', ep.name,value
FROM sys.certificates cer
INNER JOIN sys.extended_properties ep ON class=? AND ep.major_id=cer.certificate_id
UNION ALL --'ASYMMETRIC KEY'
SELECT amk.name,'asymmetric_key', ep.name,value
FROM sys.asymmetric_keys amk
INNER JOIN sys.extended_properties ep ON class=? AND ep.major_id=amk.asymmetric_key_id
SELECT --'SYMMETRIC KEY'
smk.name,'symmetric_key', ep.name,value
FROM sys.symmetric_keys smk
INNER JOIN sys.services sv ON class=? AND ep.major_id=smk.symmetric_key_id
Here's a table outlining the `class` values for different database items:
| class |
tinyint |
Identifies the class of item on which the property exists. Can be one of the following:
0 = Database
1 = Object or column
2 = Parameter
3 = Schema
4 = Database principal
5 = Assembly
6 = Type
7 = Index
8 = User defined table type column
10 = XML schema collection
15 = Message type
16 = Service contract
17 = Service
18 = Remote service binding
19 = Route
20 = Dataspace (filegroup or partition scheme)
21 = Partition function
22 = Database file
27 = Plan guide |
Additional Resources
For more detailed information, please refer to the following resources: