平時(shí)我們操作比較多的都是表里的數(shù)據(jù),也許突然有一天會(huì)需要把所有表的名字都列出來看一看——比如,你的論壇是按每個(gè)版塊一個(gè)表來管理的,這時(shí)候你要在首頁列出各版塊的名字。應(yīng)該怎么辦呢?
肯定得用SELECT吧……但我們平時(shí)使用SELECT操作的數(shù)據(jù)都是表里的數(shù)據(jù),表的名字并不是表的數(shù)據(jù),這可怎么辦呢?
你可能會(huì)想:“功能強(qiáng)大的SQL Server不會(huì)連這么簡單的功能都實(shí)現(xiàn)不了吧?一定會(huì)把所有表的名字存儲(chǔ)在某個(gè)表里……”注意啦!在這兒我要小小地偷換一下概念了——視圖(View)也算是一種“表”,只不過它是由固定查詢形成的一種“虛擬表”。
OK,你猜對(duì)啦!由SQL Server管理的每個(gè)數(shù)據(jù)庫里都有一個(gè)名為sysobjects的視圖,它是system級(jí)別的,所以它的全限定名是——sys.sysobjects
你可能又會(huì)問:“為什么不是sys.tables而是sys.objects呢?”問的好!因?yàn)檫@張表里存儲(chǔ)的可不光是數(shù)據(jù)庫里的表,它存儲(chǔ)的是一個(gè)數(shù)據(jù)庫中所有的“對(duì)象”——雜七雜八包括了表的主鍵、存儲(chǔ)過程、觸發(fā)器等等,一共是24種——表(Table,確切地說是“用戶自定義表”)只是這24種對(duì)象中的一種。
剩下的事情……吼吼……
執(zhí)行下面的查詢語句,可以得到所有包含在sys.sysobjects視圖里的數(shù)據(jù)
USE AdventureWorks
SELECT *
FROM sys.sysobjects
GO
得出數(shù)據(jù)后,請(qǐng)注意名為type的列——這一列標(biāo)明了對(duì)象的類型,也就是前面提到的24種。在這里,我用一個(gè)表格把它們列出來:
AF = Aggregate function (CLR) |
C = CHECK constraint |
D = DEFAULT (constraint or stand-alone) |
F = FOREIGN KEY constraint |
FN = SQL scalar function |
FS = Assembly (CLR) scalar function |
FT = Assembly (CLR) table-valued function |
IF = SQL inline table-valued function |
IT = Internal table |
P = SQL stored procedure |
PC = Assembly (CLR) stored procedure |
PK = PRIMARY KEY constraint |
R = Rule (old-style, stand-alone) |
RF = Replication-filter-procedure |
S = System base table |
SN = Synonym |
SQ = Service queue |
TA = Assembly (CLR) DML trigger |
TF = SQL table-valued-function |
TR = SQL DML trigger |
U = Table (user-defined) |
UQ = UNIQUE constraint |
V = View |
X = Extended stored procedure |
OK,我們要得到名稱的表(用戶自定義表)就是類型為“U”的對(duì)象;而sys.objects的類型為“S”。所以,為了達(dá)到我們的最終目的,SQL語句應(yīng)該是——
USE AdventureWorks
SELECT name
FROM sys.sysobjects
WHERE type='U'
GO
下面我再給出一段用C#實(shí)現(xiàn)的代碼: