一、系统表
数据字典的详细信息请查SQL SERVER BOL,这里仅列出一部分。
1.1、sysservers
1、查看所有本地服务器及链接服务器
select*frommaster..sysservers
1.2、sysdatabases
1:查询非sa创建的所有数据库
select*frommaster..sysdatabases
wheresidnotin(selectsidfrommaster..sysloginswherename='sa')
--或者
selectdbid,nameASDB_NAMEfrommaster..sysdatabases
wheresid<>0x01
1.3、sysobjects
1:获取当前数据库中的所有用户表
selectnamefromsysobjectswherextype='U'andstatus>0
为什么要加status>0,因为表dtproperties,虽然该表的xtype为U,实质上它是系统表。
dtproperties这个表里保存的是关系图,如果没建关系图,就是空的。
注意:这个表只是数据库对象的属性,如果想要看表、索引详细的属性,查看sysindexes。
2:查看当前数据库中所有存储过程
selectnameas存储过程名称fromsysobjectswherextype='P'andstatus>0
为什么要加status>0,是为了去掉当前数据库中的系统存储过程。
注:该系统表中type与xtype的区别是什么?
Type是在SQL SERVER 6.0就有的,xType在SQL SERVER 7.0才出现,Type的保留只是为了向后兼容。每种数据库对象的类型详见SQL SERVER BOL。
1.4、syscolumns
1:获取表或视图的所有字段,存储过程或函数的所有参数
selectnamefromsyscolumnswhereid=object_id('表名')
1.5、sysproperties
1:怎么把SQL SERVER中表设计和表注释读出来
--表的注释全在sysproperties里
selectb.name,valuefromsyspropertiesasa,sysobjectsasb
wherea.id=b.idandb.name='表名'
1.6、sysindexes
1:根据聚集索引,快速查询表的行数
SELECTrowcnt,indidFROMsysindexesWHEREid=OBJECT_ID('tableName')andindid<2
注意:使用这种方法可能不精确,因为系统的统计信息在某些时候不一定是准确的。关于统计的维护(dbcc updateusage()),详见《SQL SERVER性能优化——查询优化》series。
2:查看索引表信息
select
table_Name=sysobjects.Name,
index_Name=sysindexes.Name,
Type=sysobjects.type,
分配索引页=sysindexes.reserved,
使用索引页=sysindexes.used,
叶子层页=sysindexes.Dpages,
非叶子层页=sysindexes.used-sysindexes.Dpages,
rows=sysindexes.rowcnt
fromsysindexesleftouterjoinsysobjectsonsysindexes.id=sysobjects.id
wheresysindexes.indid>0andsysindexes.indid<255andsysindexes.status&64=0
注意:若发现非叶子层的页数为负数,最好是运行DBCC UPDATEUSAGE ('dbname','tbname','ixname')来更新一下sysindexes的信息
1.7、syslogins
SQL SERVER服务器的登录信息,比如:sa,有关登录、用户、角色的信息详见《SQL SERVER 2000管理——安全——用户权限》。
select*fromsyslogins
select*fromsysxlogins
sysxlogins是syslogins的精简版,BOL中没有说明,不推荐使用。
1.8、sysprocesses
1:查看用户进程信息
selectspid,uid,syslogins.name,login_time,net_addressfromsysprocesses,sysloginswheresysprocesses.sid=syslogins.sid
2:查看数据库启动时间
selectconvert(varchar(30),login_time,120)frommaster..sysprocesseswherespid=1
1.9、sysdepends
1:查看与某一个表相关的视图、存储过程、函数
select * from sysdepends where depid=object_id('表名')
--或者
selecta.*fromsysobjectsa,syscommentsbwherea.id=b.idandb.textlike'%表名%'
注意:这种查法,只适用在没有with Encryption选项,即没有加密该对象时。
--或者
sp_depends
注意:这个表的统计信息并不准确,没有什么好的办法,查询结果只可用于参考。
1.10、sysmessages
SQL SERVER返回的内部错误都有在这里,可自行定义进行错误的添加,但一般我习惯于新建一个错误的表来定义自己程序中的错误。
select*Frommaster..sysmessageswhereerror=5037
1.11、sysfiles、sysfilegroups
1、查询当前数据库的文件使用情况
selectname,filename,size/128as'used(M)',casemaxsize/128when0then'no limit'elsecast(maxsize/128asvarchar(10))endas'total(M)'fromsysfiles
2、查询当前数据库的表所在文件组
selectdistincta.id,a.name,b.groupid,c.groupnamefromsysobjectsainnerjoinsysindexesbona.id=b.id
innerjoinsysfilegroupsconb.groupid=c.groupid
wherea.xType='U'anda.status>0orderbya.name
sysfiles1是sysfiles的精简版,BOL中没有说明,不推荐使用。
二、系统视图
在master数据库中有INFORMATION_SCHEMA和system_function_schema两个用户,它们的登录是<无>,这是系统内置的两个用户。
INFORMATION_SCHEMA拥有自已的视图,在SQL Server 2000中没有被广泛使用,因为很多时候都可以从系统表中得到我们想要的结果,同样到了SQL Server 中,被广泛使用的仍然是sys所拥有的视图,SQL Server 的相关内容详见后续《SQL Server 》series文章。举例如下:
1、查询某个表的哪些字段不允许为空
selectCOLUMN_NAMEfromINFORMATION_SCHEMA.COLUMNS
whereIS_NULLABLE='NO'andTABLE_NAME='stb_User'
2、查询某个表的键约束
select*fromINFORMATION_SCHEMA.KEY_COLUMN_USAGE
whereTABLE_NAME='stb_User'
注:键约束,是指除了CHECK、NOT NULL外的约束,即PK,FK,UNIQUE,DEFAULT不是约束。