如何獲得資料庫裡所有表的名字(SQL+C#)
如何獲得資料庫裡所有表的名字
平時我們操作比較多的都是表裡的資料,也許突然有一天會需要把所有表的名字都列出來看一看--比如,你的論壇是按每個版塊一個表來管理的,這時候你要在首頁列出各版塊的名字。應該怎麼辦呢?
肯定得用SELECT吧..但我們平時使用SELECT操作的資料都是表裡的資料,表的名字並不是表的資料,這可怎麼辦呢?
你可能會想:"功能強大的SQL Server不會連這麼簡單的功能都實現不了吧?一定會把所有表的名字儲存在某個表裡.."注意啦!在這兒我要小小地偷換一下概念了--檢視(View)也算是一種"表",只不過它是由固定查詢形成的一種"虛擬表"。
OK,你猜對啦!由SQL Server管理的每個資料庫裡都有一個名為sysobjects的檢視,它是system級別的,所以它的全限定名是--sys.sysobjects
你可能又會問:"為什麼不是sys.tables而是sys.objects呢?"問的好!因為這張表裡儲存的可不光是資料庫裡的表,它儲存的是一個數據庫中所有的"物件"--雜七雜八包括了表的主鍵、儲存過程、觸發器等等,一共是24種--表(Table,確切地說是"使用者自定義表")只是這24種物件中的一種。
剩下的事情..吼吼..
執行下面的查詢語句,可以得到所有包含在sys.sysobjects視圖裡的資料
USE AdventureWorksSELECT*
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 AdventureWorksSELECT 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