要擷取一張表的列本身的資料,首先要瞭解sqlserver中的五張系統資料表
sysobjects,syscolumns,systypes,sysindexes,sysindexkeys
sysobjects,每個資料庫都有一張這樣的系統資料表,它記錄了所有資料庫物件,比如我們從裡面可以擷取主鍵,表對象名等
sysindexes,每個資料庫都有一張這樣的系統資料表,它記錄了所有表的索引,包括索引對象名等
sysindexkeys,每個資料庫都有一張這樣的系統資料表,它記錄了所有的索引與對應的列
syscolumns,每個資料庫都有一張這樣的系統資料表,它記錄了所有表的列,我們從裡面可以擷取表的某一列的序號,名稱,是否可以為空白等。
systypes,每個資料庫都有一張這樣的系統資料表,它記錄了所有的資料類型,我們從裡面可以擷取表的某一列資料類型的名稱,比如:varchar,int等
sysobjects裡有個xtype欄位,char(2)類型,它記錄的是對象的類型:比如PK是主鍵,S是使用者表,P是預存程序等,都是大寫的,還有一個name欄位,記錄的是對象的名稱
sysindexes裡有個name欄位,記錄了對名象名稱,還有個indid欄位,記錄了索引編號
sysindexkeys裡有個indid欄位,記錄了索引編號,還有個colid,記錄了列編號
syscolumns裡也有個xtype欄位,int類型,但它記錄的卻是本列資料類型的代碼,一些數字,這些數字與systypes表裡的xtype對應起來,這樣就可以從systypes表中擷取資料類型的名稱了,還有個colid欄位,記錄了列編號,還有個name欄位,記錄了列名,colorder欄位記錄了列序號
systypes裡有個xtype,int類型,記錄了本列資料類型的代碼,還有個name欄位,記錄了資料類型名
syscolumns,sysindexes,sysindexkeys中的id欄位對應的是所屬表的id,而不是自己資料的id
syscolumns,sysindexes,sysindexkeys中的資料不帶有唯一性,因為這是所有表共用一個系統資料表,所以colid,indid之類的都只是在id即表名不同的情況下唯一
這樣,跟據以上的分析,我們就能得到一個表的欄位的具體資訊了
從syscolumns中得到列序號,列名,是否可以為空白
從syscolumns和systypes中得到資料類型
從全部五張表中得到主鍵資訊
可以看出,主要是得到主鍵用的代碼多啊!
select a.colorder Number,
a.name ColumnName,
b.name Type,
(case when a.isnullable=1 then 'Y'else 'N' end) AllowNull,
(case when
(SELECT count(*) FROM sysobjects WHERE name IN
(SELECT name FROM sysindexes WHERE id = a.id AND indid in
(SELECT indid FROM sysindexkeys WHERE id = a.id AND colid in
(SELECT colid FROM syscolumns WHERE id = a.id AND name = a.name)))
AND xtype = 'PK')>0 then 'Y' else 'N'end) IsPrimaryKey
from syscolumns a left join systypes b on a.xtype=b.xusertype
where a.id=OBJECT_ID('b') order by a.colorder