管理杂谈OA答疑ERP答疑教程搜索

一键导出表结构!SQL Server字段属性查询脚本,告别手动整理文档


今天分享一个DBA和开发人员必备的神器——查询表字段属性的SQL脚本

接手一个老项目,没有表结构文档?数据库表太多,想快速了解字段信息?写接口文档需要字段说明?这个脚本一键搞定!

一、为什么需要这个脚本?

以前你可能要一个个点开表看设计,几十个表下来累死。今天这个脚本,让你秒出结果!

二、脚本代码

-- 查询指定表的所有字段属性SELECT     表名 = CASE WHEN a.colorder = 1 THEN d.name ELSE '' END,    表说明 = CASE WHEN a.colorder = 1 THEN ISNULL(f.value, ''ELSE '' END,    字段序号 = a.colorder,    字段名 = a.name,    标识 = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity'= 1 THEN '√' ELSE '' END,    主键 = CASE WHEN EXISTS(        SELECT 1 FROM sysobjects         WHERE xtype = 'PK' AND parent_obj = a.id AND name IN (            SELECT name FROM sysindexes WHERE indid IN (                SELECT indid FROM sysindexkeys WHERE id = a.id AND colid = a.colid            )        )    ) THEN '√' ELSE '' END,    类型 = b.name,    占用字节数 = a.length,    长度 = COLUMNPROPERTY(a.id, a.name, 'PRECISION'),    小数位数 = ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0),    允许空 = CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END,    默认值 = ISNULL(e.text, ''),    字段说明 = ISNULL(g.[value], '')FROM     syscolumns aLEFT JOIN     systypes b ON a.xusertype = b.xusertypeINNER JOIN     sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties'LEFT JOIN     syscomments e ON a.cdefault = e.idLEFT JOIN     sysproperties g ON a.id = g.id AND a.colid = g.smallid  LEFT JOIN     sysproperties f ON d.id = f.id AND f.smallid = 0WHERE     d.name = '要查询的表'  -- 这里改成你的表名,不写则查询所有表ORDER BY     a.id, a.colorder

三、怎么用?改个表名就行!

-- 查询 authors 表的所有字段WHERE d.name = 'authors'
-- 不写表名,查询当前数据库所有表-- WHERE d.name = '要查询的表'   -- 注释掉这行
执行结果
表名    表说明 字段序号 字段名    标识 主键 类型    长度 允许空 默认值      字段说明authors       1       au_id          √    id      11           (无)authors       2       au_lname              varchar 40          authors       3       au_fname              varchar 20          authors       4       phone                 char    12          ('UNKNOWN')authors       5       address               varchar 40     √    authors       6       city                  varchar 20     √    authors       7       state                 char    2      √    authors       8       zip                   char    5      √    authors       9       contract              bit     1           

四、字段说明怎么看?

字段
含义
用途
表名
表名称
只显示一次,方便阅读
表说明
表的备注
扩展属性中的说明
字段序号
字段顺序
建表时的顺序
字段名
列名称
代码中使用的名称
标识
√表示是标识列
自增长字段
主键
√表示是主键
唯一标识一行
类型
数据类型
int/varchar/datetime等
长度
字段长度
varchar(50)中的50
小数位数
小数精度
decimal(18,2)中的2
允许空
√表示允许NULL
插入时是否必须
默认值
默认值定义
getdate()等
字段说明
字段备注
业务含义说明

五、实战应用场景

场景1:生成表结构文档

-- 一键导出所有用户表的字段信息SELECT     d.name AS 表名,    a.name AS 字段名,    b.name AS 类型,    a.length AS 长度,    CASE WHEN a.isnullable = 1 THEN '是' ELSE '否' END AS 允许空,    ISNULL(g.[value], ''AS 字段说明FROM     syscolumns aLEFT JOIN systypes b ON a.xusertype = b.xusertypeINNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties'LEFT JOIN sysproperties g ON a.id = g.id AND a.colid = g.smallidORDER BY d.name, a.colorder

场景2:生成实体类代码(C#)

-- 根据表结构自动生成C#实体类SELECT     'public ' +     CASE b.name         WHEN 'int' THEN 'int'        WHEN 'varchar' THEN 'string'        WHEN 'nvarchar' THEN 'string'        WHEN 'datetime' THEN 'DateTime'        WHEN 'bit' THEN 'bool'        WHEN 'decimal' THEN 'decimal'        ELSE 'object'    END + ' ' +     a.name + ' { get; set; }' +     CASE WHEN g.[valueIS NOT NULL THEN ' // ' + g.[valueELSE '' END AS CSharpPropertyFROM     syscolumns aLEFT JOIN systypes b ON a.xusertype = b.xusertypeINNER JOIN sysobjects d ON a.id = d.id AND d.name = 'authors'WHERE d.xtype = 'U'
结果
public int au_id { getset; } // 作者IDpublic string au_lname { getset; } // 姓氏public string au_fname { getset; } // 名字public string phone { getset; } // 电话public string address { getset; } // 地址

场景3:检查字段规范

-- 找出没有字段说明的表字段SELECT     d.name AS 表名,    a.name AS 字段名,    b.name AS 类型FROM     syscolumns aLEFT JOIN systypes b ON a.xusertype = b.xusertypeINNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U'LEFT JOIN sysproperties g ON a.id = g.id AND a.colid = g.smallidWHERE g.[valueIS NULL OR g.[value= ''ORDER BY d.name, a.colorder

场景4:检查字段类型是否合理

-- 找出可能是电话号码、手机号的varchar字段(长度不符)SELECT     d.name AS 表名,    a.name AS 字段名,    b.name AS 类型,    a.length AS 长度FROM     syscolumns aLEFT JOIN systypes b ON a.xusertype = b.xusertypeINNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U'WHERE     (a.name LIKE '%phone%' OR a.name LIKE '%tel%' OR a.name LIKE '%mobile%')    AND a.length NOT IN (1120)  -- 手机号11位,座机可能带区号ORDER BY d.name, a.colorder

场景5:对比两个表的字段差异

-- 对比表A和表B的字段差异SELECT     '表A独有' AS 类型,    a.name AS 字段名,    b.name AS 类型FROM     (SELECT * FROM syscolumns WHERE id = OBJECT_ID('表A')) aLEFT JOIN     (SELECT * FROM syscolumns WHERE id = OBJECT_ID('表B')) b ON a.name = b.nameWHERE b.name IS NULL
UNION ALL
SELECT     '表B独有' AS 类型,    b.name AS 字段名,    b.type AS 类型FROM     (SELECT * FROM syscolumns WHERE id = OBJECT_ID('表A')) aRIGHT JOIN     (SELECT * FROM syscolumns WHERE id = OBJECT_ID('表B')) b ON a.name = b.nameWHERE a.name IS NULL

六、SQL Server 2005+ 增强版

-- 适用于 SQL Server 2005/2008/2012/2016/2019/2022SELECT     表名 = OBJECT_NAME(a.object_id),    字段序号 = a.column_id,    字段名 = a.name,    标识 = CASE WHEN a.is_identity = 1 THEN '√' ELSE '' END,    主键 = CASE WHEN EXISTS(        SELECT 1 FROM sys.indexes i        INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id        WHERE i.is_primary_key = 1 AND ic.column_id = a.column_id AND ic.object_id = a.object_id    ) THEN '√' ELSE '' END,    类型 = t.name,    最大长度 = a.max_length,    精度 = a.precision,    小数位数 = a.scale,    允许空 = CASE WHEN a.is_nullable = 1 THEN '√' ELSE '' END,    默认值 = OBJECT_DEFINITION(a.default_object_id),    字段说明 = ISNULL(ep.value, '')FROM     sys.columns aINNER JOIN     sys.types t ON a.user_type_id = t.user_type_idINNER JOIN     sys.objects o ON a.object_id = o.object_id AND o.type = 'U'LEFT JOIN     sys.extended_properties ep ON a.object_id = ep.major_id     AND a.column_id = ep.minor_id     AND ep.name = 'MS_Description'WHERE     o.name = '要查询的表'  -- 这里改成你的表名ORDER BY     a.column_id

七、常用扩展查询

查询所有表的基本信息

-- 快速查看数据库有哪些表SELECT     表名 = name,    创建日期 = crdate,    修改日期 = refdateFROM sysobjectsWHERE xtype = 'U'ORDER BY name

查询表的数据量

-- 查看各表记录数SELECT     OBJECT_NAME(id) AS 表名,    rows AS 记录数FROM sysindexesWHERE indid IN (0,1)ORDER BY rows DESC

综合查询:表名+字段数+数据量

SELECT     o.name AS 表名,    (SELECT COUNT(*FROM syscolumns WHERE id = o.id) AS 字段数,    ISNULL(i.rows, 0AS 数据行数,    o.crdate AS 创建时间FROM     sysobjects oLEFT JOIN     sysindexes i ON o.id = i.id AND i.indid IN (0,1)WHERE     o.xtype = 'U'ORDER BY     数据行数 DESC

八、常见问题

Q:字段说明为什么是空的?
A:说明来自扩展属性,如果没有设置就是空。可以通过sp_addextendedproperty添加。

Q:怎么给字段添加说明?
A:使用系统存储过程:

-- 给表的字段添加说明EXEC sp_addextendedproperty     @name = N'MS_Description'    @value = N'作者ID,主键'    @level0type = N'SCHEMA'@level0name = 'dbo',    @level1type = N'TABLE'@level1name = 'authors',    @level2type = N'COLUMN'@level2name = 'au_id'

九、总结

这个脚本的核心价值:

场景
原来怎么做
现在怎么做
查表结构
一个个点开表看设计
一条SQL搞定
写文档
手动复制粘贴
直接导出结果
代码生成
手写实体类
脚本自动生成
问题排查
到处翻找
秒查字段属性

适用版本

阅读原文:原文链接


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn