平時我們操作比較多的都是表裏的數據,也許突然有一天會需要把所有表的名字都列出來看一看——比如,你的論壇是按每個版塊一個表來管理的,這時候你要在首頁列出各版塊的名字。應該怎麼辦呢?
肯定得用SELECT吧……但我們平時使用SELECT操作的數據都是表裏的數據,表的名字並不是表的數據,這可怎麼辦呢?
你可能會想:“功能強大的SQL Server不會連這麼簡單的功能都實現不了吧?一定會把所有表的名字存儲在某個表裏……”注意啦!在這兒我要小小地偷換一下概念了——視圖(View)也算是一種“表”,只不過它是由固定查詢形成的一種“虛擬表”。
OK,你猜對啦!由SQL Server管理的每個數據庫裏都有一個名爲sysobjects的視圖,它是system級別的,所以它的全限定名是——sys.sysobjects
你可能又會問:“爲什麼不是sys.tables而是sys.objects呢?”問的好!因爲這張表裏存儲的可不光是數據庫裏的表,它存儲的是一個數據庫中所有的“對象”——雜七雜八包括了表的主鍵、存儲過程、觸發器等等,一共是24種——表(Table,確切地說是“用戶自定義表”)只是這24種對象中的一種。
剩下的事情……
執行下面的查詢語句,可以得到所有包含在sys.sysobjects視圖裏的數據SELECT * FROM sys.sysobjects
GO
href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/02/clip_filelist.xml" rel="File-List" />
得出數據後,請注意名爲type的列——這一列標明瞭對象的類型,也就是前面提到的24種。在這裏,我用一個表格把它們列出來:
href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_filelist.xml" rel="File-List" />
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
href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/07/clip_filelist.xml" rel="File-List" /> href="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/07/clip_editdata.mso" rel="Edit-Time-Data" />
PS: SELECT name FROM sys.sysobjects WHERE type='U' 查詢的結果中除了用戶自定義的表之外,還有一個dtproperties表,爲了得到確切的用戶自定義表的列表,需要在查詢條件中添加一個條件,即name<>'dtproperties'。即:"select name from sysobjects where type='U'and name<>'dtproperties'"
另外的方法:
SQL2005遍歷SQL數據庫上表名
strcmd = "select name from sysobjects where objectproperty(id, N'IsUserTable')=1";
SQL2005遍歷SQL數據庫上存儲過程名
strcmd = "select name from sysobjects where objectproperty(id, N'IsProcedure')=1";