想获得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值。