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字段就可以了!

时间: 2024-10-22 01:32:38

Sql中获取表结构(字段名称,类型,长度,说明)的相关文章

Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子 时间:2012-11-20 17:54:02 在JDBCPreparedStatement.executeQuery().getMetaData();后,我们可以通过ResultSetMetaData对象查询返回结果集的源数据信息,也就是表结构信息. 示例代码如下: package astar.sutil.db; import java.sql.Connection; import java.sql.Driv

PostgreSQL数据库中获取表主键名称

PostgreSQL数据库中获取表主键名称 一.如下表示,要获取teacher表的主键信息: select pg_constraint.conname as pk_name,pg_attribute.attname as colname,pg_type.typname as typename from pg_constraint inner join pg_class on pg_constraint.conrelid = pg_class.oid inner join pg_attribute

WordPress数据库中的表、字段、类型及说明

wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. cat_name – 某个分类的名称,为一个varchar(55)值. category_nicename – 指定给分类的一个便于记住的名字,也就是所谓的slug,这是一个varchar(200)值. category_description – 某个分类的详细说明,longtext型值. cate

数据库,表,字段,类型等查询

--获取所有数据库名 SELECT Name FROM Master..SysDatabases ORDER BY Name --获取所有表名 XType='U':表示所有用户表; XType='S':表示所有系统表; SELECT Name FROM [GWI-Pay]..SysObjects Where XType='U' ORDER BY Name --获取表中的字段名 SELECT Name FROM SysColumns WHERE id=Object_Id('Order') --获取

使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String ur

SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释

SQLServer 2005 SELECT d.name N'TableName', d.xtype N'TableType', a.colorder N'ColumnIndex', a.name N'ColumnName', (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '1'else '0' end) N'IdnetityFG', (case when (SELECT count(*) FROM sysobjects

Oracle获取表结构信息:表名、是否视图、字段名、类型、长度、非空、主键

select a.TABLE_NAME as "TableName", case when (select count(*) from user_views v where v.VIEW_NAME =a.TABLE_NAME )>0 then 'V' else 'U'end as "TableType", a.COLUMN_NAME as "ColumnName", A.COLUMN_ID as "ColumnIndex"

SQL Server2008中通过SQL获取表结构

SQL Server2008中通过SQL获取表结构 新增数据用户,角色为public.映射到待获取表结构的数据库上,授与用户在该数据库上的身份为db_owner 运行例如以下SQL语句: select syscolumns.name as [Name] , systypes.name as [Type], syscolumns.length AS [Size], syscolumns.xprec As [Precision], ISNULL(syscolumns.scale, 0) AS [Sc

通过jdbc获取数据库中的表结构

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户.关于MetaData的说明网上也有不少,这里我只是从我自身学习的角度来记录一下简单使用JDBC以及获取数据表相关信息的方法. DatabaseMetaData dbmd = con.getMetaData()