平時我們操作比較多的都是表里的數據,也許突然有一天會需要把所有表的名字都列出來看一看——比如,你的論壇是按每個版塊一個表來管理的,這時候你要在首頁列出各版塊的名字。應該怎么辦呢?
肯定得用SELECT吧……但我們平時使用SELECT操作的數據都是表里的數據,表的名字并不是表的數據,這可怎么辦呢?
你可能會想:“功能強大的SQL Server不會連這么簡單的功能都實現不了吧?一定會把所有表的名字存儲在某個表里……”注意啦!在這兒我要小小地偷換一下概念了——視圖(View)也算是一種“表”,只不過它是由固定查詢形成的一種“虛擬表”。
OK,你猜對啦!由SQL Server管理的每個數據庫里都有一個名為sysobjects的視圖,它是system級別的,所以它的全限定名是——sys.sysobjects
你可能又會問:“為什么不是sys.tables而是sys.objects呢?”問的好!因為這張表里存儲的可不光是數據庫里的表,它存儲的是一個數據庫中所有的“對象”——雜七雜八包括了表的主鍵、存儲過程、觸發器等等,一共是24種——表(Table,確切地說是“用戶自定義表”)只是這24種對象中的一種。
剩下的事情……吼吼……
執行下面的查詢語句,可以得到所有包含在sys.sysobjects視圖里的數據
USE AdventureWorks
SELECT *
FROM sys.sysobjects
GO
得出數據后,請注意名為type的列——這一列標明了對象的類型,也就是前面提到的24種。在這里,我用一個表格把它們列出來:
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”的對象;而sys.objects的類型為“S”。所以,為了達到我們的最終目的,SQL語句應該是——
USE AdventureWorks
SELECT name
FROM sys.sysobjects
WHERE type='U'
GO
下面我再給出一段用C#實現的代碼: