出处:http://www.jasonlee.cn/article.asp?id=310
1、sysobjects
系统对象表。保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等
sysobjects重要字段解释:
sysObjects(
Namesysname,--object名称
idint,--objectid
xtypechar(2),--object类型
typechar(2),--Object类型(与xtype似乎一模一样?有点郁闷…)
uidsmallint,--object所有者的ID
...--其他的字段不常用到。
)
其中,需要解释的是xtype和type是一模一样的(不知道ms搞什么名堂),他的数据为:
C=CHECK约束
D=默认值或DEFAULT约束
F=FOREIGNKEY约束
FN=标量函数
IF=内嵌表函数
K=PRIMARYKEY或UNIQUE约束
L=日志
P=存储过程
R=规则
RF=复制筛选存储过程
S=系统表
TF=表函数
TR=触发器
U=用户表
V=视图
X=扩展存储过程
我们会在什么时候用到sysobjects呢?最常见的:
a、我打算创建一个表table1在数据库db1中。如果table1不存在,则直接建立,如果table1已经存在,则删除重新建立。
那么,在t-sql批处理命令中这么写:
usedb1
go
ifexists(Select*FromsysObjectsWhere[Name]='table1andxtype='U')
DropTabletable1
go
Createtable1(
fd1int,
fd2int,
...
)
go
----------------------------------------------------------------------
以上代码没有测试,顺手写写的。希望不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
b、我打算大概统计一下,某个数据库系统中有多少个tb,多少个SP,多少个FN,以及多少个vw,以粗略估算一下需要多少工作量。
以系统自带数据库northwind为例
usenorthwind
go
SelectIsNull(Cast(xTypeasvarchar(4)),'总计')as'分类',
Count(*)as'计数'
fromsysobjects
WhereXType='U'orXtype='P'orXtype='FN'orXtype='V'
GroupbyxType
withcube
结果为:
分类计数
---------------
P38
U14
V18
总计70
(所影响的行数为5行)
----------------------------------------------------------------------
可知,northwind数据库有0个fn,38个sp,14个TB,还有18个VW,总计70个重要对象。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
2、sysColumns
数据库字段表。当前数据库的所有字段都保留在里面。
重要字段解释:
sysColumns(
namesysname,--字段名称
idint,--该字段所属的表的ID
xtypetinyInt,--该字段类型,关联sysTypes表
lengthsmallint,--该字段物理存储长度
...
)
最常的应用,莫过于想看看某一个表,有哪些字段,以及字段的长度了。
比如,我想看看northwind中employees表的字段以及长度情况:
usenorthwind
go
Selectobject_name(c.id)as'tablename',
c.[name]as'column',
t.[name]as'type',
c.[length]
FromsysColumnscinnerjoinsystypestonc.xtype=t.xtypeandt.[name]<>'sysname'
Wherec.id=object_id('employees')
orderbyc.colOrder
那么结果为:
tablenamecolumntypelength
---------------------------------------------------------------
EmployeesEmployeeIDint4
EmployeesLastNamenvarchar40
EmployeesFirstNamenvarchar20
EmployeesTitlenvarchar60
EmployeesTitleOfCourtesynvarchar50
EmployeesBirthDatedatetime8
EmployeesHireDatedatetime8
EmployeesAddressnvarchar120
EmployeesCitynvarchar30
EmployeesRegionnvarchar30
EmployeesPostalCodenvarchar20
EmployeesCountrynvarchar30
EmployeesHomePhonenvarchar48
EmployeesExtensionnvarchar8
EmployeesPhotoimage16
EmployeesNotesntext16
EmployeesReportsToint4
EmployeesPhotoPathnvarchar510
----------------------------------------------------------------------
呵呵,其实认真看看,可以看见length的长度和表创建的长度是不一致的(翻倍了)……注意看我上面的注明,是物理存储长度。
实际上,字符串类型的,需要除以2的。
其中,还引用到了另外一个系统表sysTypes,简单说明一下:这个系统表是用来存放数据类型的。我这里为了方便,把类型翻译过来
了。不然type就是一些ID号了。看得大家不爽。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
3、sysUsers
当前数据库的系统组,以及用户。
sysUsers(
uidsmallint,--用户id
namesmallint,--名称
uidvarbinary(85),--属于一个登陆
....
)
这个系统表没啥好说的,我讲大家还不如自己去看onlinehelp。
简单举个例子把:
查看当前数据库有那些用户:
usenorthwind
go
select*Fromsysuserswherestatus<>0
结果为:
uididnamesid其他字段(略)
-------------------------------------------------------------------------------
22guest0x00
12dbo0x01
52chair30x8750E1247F2BDF4280C44D23FDADEAF6
4、sysdenpends
当前数据库的依赖关系。怎么说呢?一下子不知道怎么表达了。
就这样举个例子吧。
比如,我修改别人的垃圾代码,看得严重不爽,然后需要修改他的表,那么,我担心会影响到其他的sp,vw,或者fn。
这个时候,我需要先查询一下,看看有那些程序调用到了这个表。
下面的例子,显示northwind数据库中,谁引用了products这个表
于是:
usenorthwind
go
Selectdistinctobject_name(d.id)as'program',
o.xtype
fromsysdependsdinnerjoinsysobjectsoond.id=o.id
whereobject_name(depid)='products'
于是得到结果
programxtype
------------------------------------
AlphabeticallistofproductsV
CK_Products_UnitPriceC
CK_ReorderLevelC
CK_UnitsInStockC
CK_UnitsOnOrderC
CurrentProductListV
CustOrderHistP
CustOrdersDetailP
InvoicesV
orderDetailsExtendedV
ProductSalesfor1997V
ProductsAboveAveragePriceV
ProductsbyCategoryV
SalesbyCategoryV
SalesByCategoryP
TenMostExpensiveProductsP
----------------------------------------------------------------------
看看,一看就明白了吧?至于xtype的类型,在sysObjects中已经有介绍了。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
-----------------------------------------------------------------------
好了。一般程序员用到的系统表,基本也就这几个。
其他的特殊的系统表(主要都在master或者tempdb)里面了,大家自己摸索摸索把。或者以后再说了。:)
1、sysobjects
系统对象表。保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等
sysobjects重要字段解释:
sysObjects(
Namesysname,--object名称
idint,--objectid
xtypechar(2),--object类型
typechar(2),--Object类型(与xtype似乎一模一样?有点郁闷…)
uidsmallint,--object所有者的ID
...--其他的字段不常用到。
)
其中,需要解释的是xtype和type是一模一样的(不知道ms搞什么名堂),他的数据为:
C=CHECK约束
D=默认值或DEFAULT约束
F=FOREIGNKEY约束
FN=标量函数
IF=内嵌表函数
K=PRIMARYKEY或UNIQUE约束
L=日志
P=存储过程
R=规则
RF=复制筛选存储过程
S=系统表
TF=表函数
TR=触发器
U=用户表
V=视图
X=扩展存储过程
我们会在什么时候用到sysobjects呢?最常见的:
a、我打算创建一个表table1在数据库db1中。如果table1不存在,则直接建立,如果table1已经存在,则删除重新建立。
那么,在t-sql批处理命令中这么写:
usedb1
go
ifexists(Select*FromsysObjectsWhere[Name]='table1andxtype='U')
DropTabletable1
go
Createtable1(
fd1int,
fd2int,
...
)
go
----------------------------------------------------------------------
以上代码没有测试,顺手写写的。希望不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
b、我打算大概统计一下,某个数据库系统中有多少个tb,多少个SP,多少个FN,以及多少个vw,以粗略估算一下需要多少工作量。
以系统自带数据库northwind为例
usenorthwind
go
SelectIsNull(Cast(xTypeasvarchar(4)),'总计')as'分类',
Count(*)as'计数'
fromsysobjects
WhereXType='U'orXtype='P'orXtype='FN'orXtype='V'
GroupbyxType
withcube
结果为:
分类计数
---------------
P38
U14
V18
总计70
(所影响的行数为5行)
----------------------------------------------------------------------
可知,northwind数据库有0个fn,38个sp,14个TB,还有18个VW,总计70个重要对象。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
2、sysColumns
数据库字段表。当前数据库的所有字段都保留在里面。
重要字段解释:
sysColumns(
namesysname,--字段名称
idint,--该字段所属的表的ID
xtypetinyInt,--该字段类型,关联sysTypes表
lengthsmallint,--该字段物理存储长度
...
)
最常的应用,莫过于想看看某一个表,有哪些字段,以及字段的长度了。
比如,我想看看northwind中employees表的字段以及长度情况:
usenorthwind
go
Selectobject_name(c.id)as'tablename',
c.[name]as'column',
t.[name]as'type',
c.[length]
FromsysColumnscinnerjoinsystypestonc.xtype=t.xtypeandt.[name]<>'sysname'
Wherec.id=object_id('employees')
orderbyc.colOrder
那么结果为:
tablenamecolumntypelength
---------------------------------------------------------------
EmployeesEmployeeIDint4
EmployeesLastNamenvarchar40
EmployeesFirstNamenvarchar20
EmployeesTitlenvarchar60
EmployeesTitleOfCourtesynvarchar50
EmployeesBirthDatedatetime8
EmployeesHireDatedatetime8
EmployeesAddressnvarchar120
EmployeesCitynvarchar30
EmployeesRegionnvarchar30
EmployeesPostalCodenvarchar20
EmployeesCountrynvarchar30
EmployeesHomePhonenvarchar48
EmployeesExtensionnvarchar8
EmployeesPhotoimage16
EmployeesNotesntext16
EmployeesReportsToint4
EmployeesPhotoPathnvarchar510
----------------------------------------------------------------------
呵呵,其实认真看看,可以看见length的长度和表创建的长度是不一致的(翻倍了)……注意看我上面的注明,是物理存储长度。
实际上,字符串类型的,需要除以2的。
其中,还引用到了另外一个系统表sysTypes,简单说明一下:这个系统表是用来存放数据类型的。我这里为了方便,把类型翻译过来
了。不然type就是一些ID号了。看得大家不爽。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
3、sysUsers
当前数据库的系统组,以及用户。
sysUsers(
uidsmallint,--用户id
namesmallint,--名称
uidvarbinary(85),--属于一个登陆
....
)
这个系统表没啥好说的,我讲大家还不如自己去看onlinehelp。
简单举个例子把:
查看当前数据库有那些用户:
usenorthwind
go
select*Fromsysuserswherestatus<>0
结果为:
uididnamesid其他字段(略)
-------------------------------------------------------------------------------
22guest0x00
12dbo0x01
52chair30x8750E1247F2BDF4280C44D23FDADEAF6
4、sysdenpends
当前数据库的依赖关系。怎么说呢?一下子不知道怎么表达了。
就这样举个例子吧。
比如,我修改别人的垃圾代码,看得严重不爽,然后需要修改他的表,那么,我担心会影响到其他的sp,vw,或者fn。
这个时候,我需要先查询一下,看看有那些程序调用到了这个表。
下面的例子,显示northwind数据库中,谁引用了products这个表
于是:
usenorthwind
go
Selectdistinctobject_name(d.id)as'program',
o.xtype
fromsysdependsdinnerjoinsysobjectsoond.id=o.id
whereobject_name(depid)='products'
于是得到结果
programxtype
------------------------------------
AlphabeticallistofproductsV
CK_Products_UnitPriceC
CK_ReorderLevelC
CK_UnitsInStockC
CK_UnitsOnOrderC
CurrentProductListV
CustOrderHistP
CustOrdersDetailP
InvoicesV
orderDetailsExtendedV
ProductSalesfor1997V
ProductsAboveAveragePriceV
ProductsbyCategoryV
SalesbyCategoryV
SalesByCategoryP
TenMostExpensiveProductsP
----------------------------------------------------------------------
看看,一看就明白了吧?至于xtype的类型,在sysObjects中已经有介绍了。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
-----------------------------------------------------------------------
好了。一般程序员用到的系统表,基本也就这几个。
其他的特殊的系统表(主要都在master或者tempdb)里面了,大家自己摸索摸索把。或者以后再说了。:)