一、系統(tǒng)表
數(shù)據(jù)字典的詳細(xì)信息請查SQL SERVER BOL,這里僅列出一部分。
1.1、sysservers
1、查看所有本地服務(wù)器及鏈接服務(wù)器
select * from master..sysservers
1.2、sysdatabases
1:查詢非sa創(chuàng)建的所有數(shù)據(jù)庫
select * from master..sysdatabases
where sid not in(select sid from master..syslogins where name='sa')
--或者
select dbid, name AS DB_NAME from master..sysdatabases
where sid <> 0x01
1.3、sysobjects
1:獲取當(dāng)前數(shù)據(jù)庫中的所有用戶表
select name from sysobjects where xtype='U' and status>0
為什么要加status>0,因?yàn)楸?/span>dtproperties,雖然該表的xtype為U,實(shí)質(zhì)上它是系統(tǒng)表。
dtproperties這個表里保存的是關(guān)系圖,如果沒建關(guān)系圖,就是空的。
注意:這個表只是數(shù)據(jù)庫對象的屬性,如果想要看表、索引詳細(xì)的屬性,查看sysindexes。
2:查看當(dāng)前數(shù)據(jù)庫中所有存儲過程
select name as 存儲過程名稱 from sysobjects where xtype='P' and status>0
為什么要加status>0,是為了去掉當(dāng)前數(shù)據(jù)庫中的系統(tǒng)存儲過程。
注:該系統(tǒng)表中type與xtype的區(qū)別是什么?
Type是在SQL SERVER 6.0就有的,xType在SQL SERVER 7.0才出現(xiàn),Type的保留只是為了向后兼容。每種數(shù)據(jù)庫對象的類型詳見SQL SERVER BOL。
1.4、syscolumns
1:獲取表或視圖的所有字段,存儲過程或函數(shù)的所有參數(shù)
select name from syscolumns where id=object_id('表名')
1.5、sysproperties
1:怎么把SQL SERVER中表設(shè)計和表注釋讀出來
--表的注釋全在sysproperties里
select b.name,value from sysproperties as a,sysobjects as b
where a.id=b.id and b.name='表名'
1.6、sysindexes
1:根據(jù)聚集索引,快速查詢表的行數(shù)
SELECT rowcnt,indid FROM sysindexes WHERE id=OBJECT_ID('tableName')and indid < 2
注意:使用這種方法可能不精確,因?yàn)橄到y(tǒng)的統(tǒng)計信息在某些時候不一定是準(zhǔn)確的。關(guān)于統(tǒng)計的維護(hù)(dbcc updateusage()),詳見《SQL SERVER 性能優(yōu)化——查詢優(yōu)化》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
from sysindexes left outer join sysobjects on sysindexes.id=sysobjects.id
where sysindexes.indid>0 and sysindexes.indid<255 and sysindexes.status & 64=0
注意:若發(fā)現(xiàn)非葉子層的頁數(shù)為負(fù)數(shù),最好是運(yùn)行DBCC UPDATEUSAGE ('dbname','tbname','ixname')來更新一下sysindexes的信息
1.7、syslogins
SQL SERVER 服務(wù)器的登錄信息,比如:sa,有關(guān)登錄、用戶、角色的信息詳見《SQL SERVER 2000 管理——安全——用戶權(quán)限》。
select * from syslogins
select * from sysxlogins
sysxlogins是syslogins的精簡版,BOL中沒有說明,不推薦使用。
1.8、sysprocesses
1:查看用戶進(jìn)程信息
select spid,uid,syslogins.name,login_time,net_address from sysprocesses,syslogins where sysprocesses.sid=syslogins.sid
2:查看數(shù)據(jù)庫啟動時間
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
1.9、sysdepends
1:查看與某一個表相關(guān)的視圖、存儲過程、函數(shù)
select * from sysdepends where depid=object_id('表名')
--或者
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
注意:這種查法,只適用在沒有with Encryption選項,即沒有加密該對象時。
--或者
sp_depends
注意:這個表的統(tǒng)計信息并不準(zhǔn)確,沒有什么好的辦法,查詢結(jié)果只可用于參考。
1.10、sysmessages
SQL SERVER返回的內(nèi)部錯誤都有在這里,可自行定義進(jìn)行錯誤的添加,但一般我習(xí)慣于新建一個錯誤的表來定義自己程序中的錯誤。
select * From master..sysmessages where error=5037
1.11、sysfiles、sysfilegroups
1、查詢當(dāng)前數(shù)據(jù)庫的文件使用情況
select name,filename,size/128 as 'used(M)',case maxsize/128 when 0 then 'no limit' else cast(maxsize/128 as varchar(10)) end as 'total(M)' from sysfiles
2、查詢當(dāng)前數(shù)據(jù)庫的表所在文件組
select distinct a.id,a.name,b.groupid,c.groupname from sysobjects a inner join sysindexes b on a.id=b.id
inner join sysfilegroups c on b.groupid=c.groupid
where a.xType='U' and a.status>0 order by a.name
sysfiles1是sysfiles的精簡版,BOL中沒有說明,不推薦使用。
二、系統(tǒng)視圖
在master數(shù)據(jù)庫中有INFORMATION_SCHEMA和system_function_schema兩個用戶,它們的登錄是<無>,這是系統(tǒng)內(nèi)置的兩個用戶。
INFORMATION_SCHEMA擁有自已的視圖,在SQL Server 2000中沒有被廣泛使用,因?yàn)楹芏鄷r候都可以從系統(tǒng)表中得到我們想要的結(jié)果,同樣到了SQL Server 2005中,被廣泛使用的仍然是sys所擁有的視圖,SQL Server 2005的相關(guān)內(nèi)容詳見后續(xù)《SQL Server 2005》series文章。舉例如下:
1、查詢某個表的哪些字段不允許為空
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where IS_NULLABLE='NO' and TABLE_NAME='stb_User'
2、查詢某個表的鍵約束
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where TABLE_NAME='stb_User'
注:鍵約束,是指除了CHECK、NOT NULL外的約束,即PK,FK,UNIQUE,DEFAULT不是約束。