SqlServer用户数据库的系统视图sysobjects、syscolumns、systypes

  想获得SqlServer用户数据库的Schema,本来想直接用ADO的SqlConnection对象的GetSchema()方法,但是架构中居然没有PrimaryKeys,只好借助于T-SQL语句了!在网上找到了一下的语句,可以正确执行。

查询用户表的信息
 1 SELECT
 2 
 3 表名=CASE WHEN a.colorder=1 THEN d.name ELSE '' END,
 4 
 5 表说明=CASE WHEN a.colorder=1 THEN isnull(f.VALUE,'') ELSE '' END,
 6 
 7 字段序号=a.colorder,
 8 
 9 字段名=a.name,
10 
11 标识=CASE WHEN COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 THEN ''ELSE '' END,
12 
13 主键=CASE WHEN EXISTS(SELECT 1 FROM sysobjects WHERE xtype='PK' AND name IN (
14 
15 SELECT name FROM sysindexes WHERE indid IN(
16 
17 SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
18 
19 ))) THEN '' ELSE '' END,
20 
21 类型=b.name,
22 
23 占用字节数=a.LENGTH,
24 
25 长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
26 
27 小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
28 
29 允许空=CASE WHEN a.isnullable=1 THEN ''ELSE '' END,
30 
31 默认值=isnull(e.text,''),
32 
33 字段说明=isnull(g.[VALUE],'')
34 
35 FROM syscolumns a
36 
37 LEFT JOIN systypes b ON a.xtype=b.xusertype
38 
39 INNER JOIN sysobjects d ON a.id=d.id AND d.xtype='U' AND d.name<>'dtproperties'
40 
41 LEFT JOIN syscomments e ON a.cdefault=e.id
42 
43 LEFT JOIN sys.extended_properties g ON a.id=g.major_id AND a.colid=g.major_id  
44 
45 LEFT JOIN sys.extended_properties f ON d.id=f.major_id AND f.major_id   =0
46 
47 --where d.name='要查询的表' --如果只查询指定表,加上此条件
48 
49 ORDER BY a.id,a.colorder

  执行结果上图所示。对应的sysobjects、syscolumns、systypes系统表没有找到,但是系统视图中可以看到,sys.sysobjects、sys.syscolumns、sys.systypes几个系统视图。

  获取数据表的方法:

select * from sysobjects where xType = 'U'

  sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。以下是此系统表的字段名称和相关说明。Name,id,xtype,uid,status:分别是对象名,对象ID,对象类型,所有者对象的用户ID,对象状态。 
  xtype:对象类型。可以是下列对象类型中的一种: 
   C = CHECK 约束 
   D = 默认值或 DEFAULT 约束 
   F = FOREIGN KEY 约束 
   L = 日志 
   FN = 标量函数 
   IF = 内嵌表函数 
   P = 存储过程 
   PK = PRIMARY KEY 约束(类型是 K) 
   RF = 复制筛选存储过程 
   S = 系统表 
   TF = 表函数 
   TR = 触发器 
   U = 用户表 
   UQ = UNIQUE 约束(类型是 K) 
   V = 视图 
   X = 扩展存储过程 
  当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。 

posted @ 2012-08-21 09:41  太一吾鱼水  阅读(535)  评论(0编辑  收藏  举报