解析包含主外关键字和自增长的sql表的结构信息查询
什么样的数据字典需要在最近的项目中完成的,这就要求表结构信息。有表结构信息在互联网上许多询问,和感觉不是很好。比较好的一点是升级后的版本信息查询基于SQL2005 SQL2008表结构的详细说明(包括国外的关键信息),但有一个小问题,因此缺少一个过滤运行一个小错误,在adventureworks2012数据库地址表查询结果如下:在查询过滤中,我们在OK中添加以下信息:
和g.class_desc = 'object_or_column
修改后的SQL如下所示:
复制代码代码如下所示:
选择表名=情况时,a.colorder = 1然后d.name
别的
结束,
表格显示的情况时,a.colorder = 1 =空(f.value,)
别的
结束,
场序数= a.colorder,
字段名称= a.name,
ID =情况时,columnproperty(张,a.name,'isidentity)= 1 V
别的
结束,
主键(=存在时)(选择1)
从dbo.sysindexes Si
内部联接dbo.sysindexkeys植si.id = sik.id
和si.indid = sik.indid
内部联接dbo.syscolumns SC sc.id = sik.id
和sc.colid = sik.colid
内部联接dbo.sysobjects等等so.name = so.name
和so.xtype = 'pk
在sc.id =张
和sc.colid = a.colid然后)v
别的
结束,
外键=情况时,tony.fkey不空
和tony.fkey = a.colid然后V
别的
结束,
外键表=情况时,tony.fkey不空
和tony.fkey = a.colid然后object_name(Tony。fkeyid)
别的
结束,
外键字段不为空的情况下tony.fkey =
和tony.fkey = a.colid
然后(选择名称)
从列
在tony.fkey给=
ID = tony.fkeyid
)
别的
结束,
类型= b.name,
长度= a.length,
精度= columnproperty(张,a.name,'precision),
小数位数=空(columnproperty(张,a.name,规模),0)。
允许空=案例a.isnullable = 1时再V
别的
结束,
默认值为空(e.text,),
描述字段为空(G. {value},),
创作时间= d.crdate,
改变时间=时a.colorder = 1然后d.refdate
其他的空
结束
从dbo.syscolumns一
左连接dbo.systypes B a.xtype = b.xusertype
内部联接dbo.sysobjects D = d.id张
和d.xtype = U
和d.status > = 0
左连接dbo.syscomments E对a.cdefault = e.id
左连接sys.extended_properties G = g.major_id张
和a.colid = g.minor_id
和g.class_desc = 'object_or_column
左连接sys.extended_properties F = f.major_id d.id
和f.minor_id = 0
左连接中对htl.parent_obj = d.id HTL
和htl.xtype = F
左连接sysforeignkeys托尼htl.id = tony.constid
在d.name = 'address--在这里,进入包含该表的名称的条件
以D.id,
a.colorder
手术结果如下:
我不太喜欢它的类型信息。一般来说,VARCHAR将长度信息,这个查询是不是SQL 2012新的数据类型的支持。有更多的嵌套查询的SQL,所以我重写SQL对我自己。
这是一个提醒,你可以用information_schema.xxx观点尽可能不使用sys.xxx观。
新SQL如下所示:
复制代码代码如下所示:
选择
——object_id(a.table_schema + a.table_name + { object_id }。),
当a.ordinal_position = 1
然后+ a.table_schema + a.table_name'。
别的
最后table_name,
当(a.ordinal_position = 1)
和p1.value不空
然后p1.value
别的
最后table_description,
a.column_name,
在((charindex('char ',a.data_type)> 0
或charindex('binary ',a.data_type)> 0
)
和a.character_maximum_length <> 1
)
然后a.data_type + '('
+投(a.character_maximum_length为varchar(4))+)
当((charindex('char ',a.data_type)> 0
或charindex('binary ',a.data_type)> 0
)
和a.character_maximum_length = - 1
然后a.data_type)+(最大)
当(charindex('numeric ',a.data_type)> 0)
然后a.data_type +(+(a.numeric_precision铸为varchar(4))
+,+投(a.numeric_scale为varchar(4))+)
其他a.data_type
最后column_type,
当c.is_identity = 1 then'yes
else'no
最后is_identity,
a.is_nullable,
当a.column_default为null,然后。
其他a.column_default
最后default_value,
当p.value是空的然后。
别的p.value
最后column_description } {,
当o.name是空的' '
剔'其他'
最后is_primarykey,
当f.parent_column_id为null,然后。
剔'其他'
最后is_foreignkeys,
当referenced_object_id为null,然后。
其他object_name(referenced_object_id)
最后foreign_table,
当referenced_object_id为null,然后。
其他(选择名称)
从sys.columns
在object_id = f.referenced_object_id
和column_id = f.referenced_column_id
)
最后foreign_key
从information_schema.columns一
内部联接sys.columns C对object_id(a.table_schema +'。
+ a.table_name)= c.object_id
和a.column_name = c.name
左连接information_schema.key_column_usage B a.table_schema = b.table_schema
和a.table_name = b.table_name
和a.column_name = b.column_name
左连接sys.sysobjects O o.name = b.constraint_name
和o.xtype = 'pk
左连接sys.extended_properties P object_id(a.table_schema +'。
+ a.table_name)= p.major_id
和a.ordinal_position = p.minor_id
和p.class_desc = 'object_or_column
左连接sys.extended_properties P1在object_id(a.table_schema +'。
+ a.table_name)= p1.major_id
和p1.minor_id = 0
左连接sys.foreign_key_columns F对object_id(a.table_schema +'。
+ a.table_name)= f.parent_object_id
和a.ordinal_position = f.parent_column_id
在a.table_name = 'address
- a.table_name在(选择的名字从系统表)
通过a.table_schema,a.table_name秩序,a.ordinal_position
运行效果如下:
请出错地方!谢谢你