为SQL Server数据库生成数据字典

问题描述 投票:0回答:5

我正在尝试为数据库中的表生成数据字典。

理想情况下,我想导出列名称、数据类型、限制和扩展属性描述。

如何实现这一目标?

sql-server sql-server-2008 data-dictionary
5个回答
13
投票

您可以尝试以下查询:

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

或模式文档生成器,例如 Dataedo (我是其产品经理)


9
投票

您可以通过

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
和使用
fn_listextendedproperty
的组合来实现此目的。


0
投票

要生成 SQL Server 数据库的数据字典,我建议您使用 ERBuilder 数据建模器,只需按照以下步骤操作:

要生成 ER 图,必须首先对数据库进行逆向工程,选择:菜单 -> 文件 -> 逆向工程,ER 图将显示在 ERBuilder 中。 要生成数据库的数据字典,请选择:菜单 -> 工具 -> 生成模型文档


0
投票

由于这是“mssql 数据字典”的第一个搜索结果,因此这里有一个简单的查询来获取数据库中的表和列的列表 -

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

给予例如

"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
...

0
投票

此查询(改编自

Bad Pit
的答案)给出了数据库中的所有“dbo”表(名为“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
;```
© www.soinside.com 2019 - 2024. All rights reserved.