Generating data dictionary for SQL Server database
Asked Answered
D

5

10

I am trying to generate a data dictionary for a table in my database.

Ideally I would like to export the column names, data type, restrictions and extended property descriptions.

How can this be achieved?

Doall answered 27/6, 2011 at 1:37 Comment(0)
G
9

You can get at this via a combination of SELECT * FROM INFORMATION_SCHEMA.COLUMNS and using fn_listextendedproperty.

Granado answered 27/6, 2011 at 1:48 Comment(3)
This didn't work for me, can you give me some feedback. here is error I get ORA-00942: table or view does not existFem
Your error indicates you tried this on Oracle. This is a SQL Server answer to a SQL Server question.Granado
Thanks mattmc3. Do you know how to do this on Oracle?Fem
U
13

You can try this query:

SELECT
    IC.COLUMN_NAME,
    IC.Data_TYPE,
    EP.[Value] as [MS_Description],
    IKU.CONSTRAINT_NAME, 
    ITC.CONSTRAINT_TYPE,
    IC.IS_NULLABLE
 FROM
    INFORMATION_SCHEMA.COLUMNS IC
    INNER JOIN sys.columns sc ON OBJECT_ID(QUOTENAME(IC.TABLE_SCHEMA) + '.' + QUOTENAME(IC.TABLE_NAME)) = sc.[object_id] AND IC.COLUMN_NAME = sc.name
    LEFT OUTER JOIN sys.extended_properties EP ON sc.[object_id] = EP.major_id AND sc.[column_id] = EP.minor_id AND EP.name = 'MS_Description' AND EP.class = 1 
    LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE IKU ON IKU.COLUMN_NAME = IC.COLUMN_NAME and IKU.TABLE_NAME = IC.TABLE_NAME and IKU.TABLE_CATALOG = IC.TABLE_CATALOG
    LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ITC ON ITC.TABLE_NAME = IKU.TABLE_NAME and ITC.CONSTRAINT_NAME = IKU.CONSTRAINT_NAME
WHERE IC.TABLE_CATALOG = 'Database'
  and IC.TABLE_SCHEMA = 'dbo'
  and IC.TABLE_NAME = 'Table'
order by IC.ORDINAL_POSITION

or schema documentation generator like Dataedo (which I am the Product Manager of).

Uziel answered 27/3, 2015 at 8:42 Comment(0)
G
9

You can get at this via a combination of SELECT * FROM INFORMATION_SCHEMA.COLUMNS and using fn_listextendedproperty.

Granado answered 27/6, 2011 at 1:48 Comment(3)
This didn't work for me, can you give me some feedback. here is error I get ORA-00942: table or view does not existFem
Your error indicates you tried this on Oracle. This is a SQL Server answer to a SQL Server question.Granado
Thanks mattmc3. Do you know how to do this on Oracle?Fem
H
0

To generate a data dictionary of your SQL Server database, I suggest you use ERBuilder data modeller, just follow these steps:

To generate an ER diagram it is necessary to first, reverse engineer your database select: Menu -> File -> Reverse Engineer the ER diagram will be displayed in ERBuilder. To generate a data dictionary of your database select: Menu -> Tool -> Generate model documentation

Hamnet answered 21/7, 2019 at 14:50 Comment(0)
P
0

Since this is the first search result for 'mssql data dictionary', here's a simple query to get the list of tables and columns in a db -

select table_name, ordinal_position, column_name, data_type 
from information_schema.columns 
order by table_name, ordinal_position;

giving eg

"table_name","ordinal_position","column_name","data_type"
Account,1,Account,varchar
Account,2,Type,varchar
Account,3,Description,varchar
Account,4,Rollup_Account,varchar
Account,5,Last_Updated,datetime
Account,6,Section_Name,varchar
Account,7,QB_ID,varchar
Additional_Charge,1,Additional_ChargeKey,int
Additional_Charge,2,Additional_Charge,int
...
Parameter answered 22/7, 2022 at 6:22 Comment(0)
E
0

This query (adapted from Bad Pit's answer) gives all the 'dbo' tables in your database (named 'myDatabaseName'):

declare @DBNAME varchar(128) ='myDatabaseName';   -- put your database name here

SELECT
    concat(IC.TABLE_NAME, '.', IC.COLUMN_NAME, ' (', ic.DATA_TYPE, ')', (case(itc.constraint_type) when('PRIMARY KEY') then (' PRIMARY KEY') else ('') end), (case(ic.IS_NULLABLE) when('YES') then (' NULLABLE') else ('') end)) as 'Data Dictionary'
 
 FROM
    INFORMATION_SCHEMA.COLUMNS IC
    INNER JOIN sys.columns sc ON OBJECT_ID(QUOTENAME(IC.TABLE_SCHEMA) + '.' + QUOTENAME(IC.TABLE_NAME)) = sc.[object_id] AND IC.COLUMN_NAME = sc.name
    LEFT OUTER JOIN sys.extended_properties EP ON sc.[object_id] = EP.major_id AND sc.[column_id] = EP.minor_id AND EP.name = 'MS_Description' AND EP.class = 1 
    LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE IKU ON IKU.COLUMN_NAME = IC.COLUMN_NAME and IKU.TABLE_NAME = IC.TABLE_NAME and IKU.TABLE_CATALOG = IC.TABLE_CATALOG
    LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ITC ON ITC.TABLE_NAME = IKU.TABLE_NAME and ITC.CONSTRAINT_NAME = IKU.CONSTRAINT_NAME
    WHERE
    
    IC.TABLE_CATALOG = @DBNAME  

    and IC.TABLE_SCHEMA = 'dbo'

order by IC.TABLE_NAME, IC.ORDINAL_POSITION
;```
Embroider answered 25/4, 2024 at 18:6 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.