sqlserver中獲取一張表中列的數據
要獲取一張表的列本身的數據,首先要了解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
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

浙公網安備 33010602011771號