zoukankan      html  css  js  c++  java
  • Sql中获取表结构(字段名称,类型,长度,说明)

    在写代码生成器的时候遇到这样一个问题,想在搭建好数据库后把字段说明当做注释写进类文件里,所以我们在网上搜索到了许多代码很长很长的方法(当然我的代码也很长),亲测了一条简单易懂的语句,也是大多数转载的方法:

    直接看结果点此处电梯直达↓


    SELECT 
    TableName = OBJECT_NAME(c.object_id), 
    ColumnsName = c.name, 
    Description = ex.value, 
    ColumnType=t.name, 
    Length=c.max_length 
    FROM 
    sys.columns c 
    LEFT OUTER JOIN 
    sys.extended_properties ex 
    ON 
    ex.major_id = c.object_id 
    AND ex.minor_id = c.column_id 
    AND ex.name = 'MS_Description' 
    left outer join 
    systypes t 
    on c.system_type_id=t.xtype 
    WHERE 
    OBJECTPROPERTY(c.object_id, 'IsMsShipped')=0 
    AND OBJECT_NAME(c.object_id) ='表名'

    亲测可用没问题,但是在测试的时候出现这样一个问题

    我的表中的确是有Title 和Category字段,但是为什么查出来的结果有两条呢?

    看ColumnType 不难理解,这两个一个是我自己的表中的字段,另一个是系统保留字段, 那么问题又回到了我最初使用的语句:

    select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from information_schema.columns where TABLE_NAME='表名'

    这样一来查询结果是这样的:

    结果中整形和ntext类型是我不需要长度的类型,结果是NULL正合我意,但是这里没有我要的字段说明。所以我打算两个语句结合起来试一下,在这之前我们需要了解一下第一个查询语句中有哪些是我们需要的。

    于是我分别尝试了查询以下3个表的内容,为了解它的结构。我们看到

    select * from sys.extended_properties
    select * from information_schema.columns
    select * from sys.columns

    首先是select * from sys.extended_properties

    结果如下:

    那么所有的表的描述都在这里了

    然后我们再来看

    select * from information_schema.columns

    select * from sys.columns

    这两张表里面内容很多,这里就不截图了,大家可以自己查一下看看内容。

    经过比较以后得出结论:在我们最先搜索到的方法中OBJECT_NAME(c.object_id)是将sys.columns中的object_id转换成表名的方法,但是sys.columns中没有我们需要的信息,所以OBJECT_NAME()方法留着备用;

    其次我们在上一个截图中sys.extended_properties表看到了major_id这个字段,这个字段有什么含义?于是我从sys.columns查询了一下sys.columns.object_id=sys.extended_properties.major_id的内容,比如上述截图中的

    select * from sys.columns where object_id=613577224

    得到的结果正好是同一张表中的字段信息,于是得出结论:

    表sys.extended_properties中的major_id和sys.columns中object_id是相关联的(主键外键关系?)

    终于我们找到了sys.extended_properties表和information_schema.columns表中共有的字段,那就是:

    sys.extended_properties.major_id和information_schema.columns.TABLE_NAME

    因为sys.columns.object_id就是sys.extended_properties.major_id  那么OBJECT_NAME(sys.extended_properties.major_id)=information_schema.columns.TABLE_NAME就是架起两者之间关系的桥梁了

     

    说了一堆废话,看最终的语句:

    select a.COLUMN_NAME,a.DATA_TYPE,a.CHARACTER_MAXIMUM_LENGTH,b.value 
    from information_schema.COLUMNS as a  left join sys.extended_properties as b 
    on a.TABLE_NAME=OBJECT_NAME(b.major_id) and a.ORDINAL_POSITION=b.minor_id where a.TABLE_NAME='表名'

    结果:

    这样只需要在代码中判断NULL字段就可以了!

  • 相关阅读:
    外包、构件和黑盒抽象等杂想
    C++类型转换小记(一)——C++转换操作符
    大学(一)
    【答】如何获取一个【备份路径】的信息?
    橘色超漂亮滑动二级导航菜单
    CSS自适应宽度按钮
    我们忽略的IE特效——一些特殊效果
    MSSQL 游标示例
    [存]超酷JS拖拽翻页效果
    漂亮的表格
  • 原文地址:https://www.cnblogs.com/cnwhm/p/4314107.html
Copyright © 2011-2022 走看看