LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

admin
2026年4月15日 14:56 本文热度 53

今天分享一个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搞定
写文档
手动复制粘贴
直接导出结果
代码生成
手写实体类
脚本自动生成
问题排查
到处翻找
秒查字段属性

适用版本

  • SQL Server 2000:使用第一个脚本

  • SQL Server 2005+:使用增强版脚本


阅读原文:原文链接


该文章在 2026/4/15 18:21:55 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号