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