1. 程式人生 > >如何獲得資料庫裡所有表的名字(SQL+C#)

如何獲得資料庫裡所有表的名字(SQL+C#)

如何獲得資料庫裡所有表的名字

平時我們操作比較多的都是表裡的資料,也許突然有一天會需要把所有表的名字都列出來看一看--比如,你的論壇是按每個版塊一個表來管理的,這時候你要在首頁列出各版塊的名字。應該怎麼辦呢?

肯定得用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#實現的程式碼:

//========>水之真諦<========//
//====>
以人為本,關注民生using System;
using System.Data.SqlClient;

namespace SqlSample
{
class Program
{
static void Main(string[] args)
{
string connectionString = @"Server=(local); Database=AdventureWorks; User ID=sa; Password=password";
SqlConnection connection = new SqlConnection();
connection.ConnectionString = connectionString;

string sqlCommandString = @"USE AdventureWorks SELECT name FROM sys.sysobjects WHERE type='U' ORDER BY name";
SqlCommand command = new SqlCommand();
command.CommandType = System.Data.CommandType.Text;
command.CommandText = sqlCommandString;
command.Connection = connection;
connection.Open();

SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader[@"name"]);
}
}
}
}

執行後得到的截圖是:嗯~~~小問題也要認真對待~~~細節體現品質。我要把這個問題加到面試題裡去,呵呵~~~

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1711647