巧用SQL語句查看SQL Server的結(jié)構(gòu)信息
常用SQLServer的朋友們,絕大部分情況下,我們寫SQL腳本主要用來處理我們自己的數(shù)據(jù),比如讀取、插入數(shù)據(jù)等。但在有些情況下,我們可能要查看我們定義的一些元素,比如我們定義的表都有哪些、表結(jié)構(gòu)如何、存儲(chǔ)過程的源碼等等。這時(shí)候,我們學(xué)習(xí)的常規(guī)的SQL腳本可能就無法處理了。
比如您要寫一個(gè)管理數(shù)據(jù)庫的程序,就要知道數(shù)據(jù)庫中有什么表、表結(jié)構(gòu)如何,以及視圖、存儲(chǔ)過程的腳本源碼等。下面我就說說如何獲取數(shù)據(jù)庫的結(jié)構(gòu)信息。
獲取數(shù)據(jù)庫及配置信息
1、獲取數(shù)據(jù)庫配置信息
- exec sp_server_info

2、返回所有數(shù)據(jù)庫
- exec sp_databases
獲取系統(tǒng)中的用戶表
有三種方法可以使用,分別是:
1、利用sysobjects系統(tǒng)表或sys.objects目錄視圖
- select * from sysobjects where xtype='U'
- select * from sys.objects where xtype='U'
2、利用sys.tables目錄視圖
- select * from sys.tables
3、利用存儲(chǔ)過程sp_tables
- exec sp_tables
獲取系統(tǒng)中所有的用戶視圖
有兩種方法可以使用,分別是:
1、利用sysobjects系統(tǒng)表或sys.objects目錄視圖
- select * from sysobjects where xtype='V'
- select * from sys.objects where xtype='V'
2、利用sys.tables目錄視圖
- select * from sys.tables
獲取數(shù)據(jù)庫中所有的用戶存儲(chǔ)過程
有兩種方法可以使用,分別是:
1、利用sysobjects系統(tǒng)表或sys.objects目錄視圖
- select * from sysobjects where xtype='P'
- select * from sys.objects where xtype='P'
2、利用sys.procedures目錄視圖
- select * from sys.procedures
獲取存儲(chǔ)過程或視圖的定義腳本
要用到系統(tǒng)視圖sys.all_objects和sys.sql_modules,寫法如下:
- select a.name,a.[type],b.[definition]
- from sys.all_objects a,sys.sql_modules b
- where a.is_ms_shipped=0 and a.object_id = b.object_id and a.[type] in ('P','V')
- order by a.[name] asc

其中 sys.all_objects 是 sql server 2012 版本中的系統(tǒng)視圖,在 更早期的 sql server 版本中,應(yīng)該用 sys.objects,同時(shí),sys.objects 在 2012 中也是可以用的,只不過考慮到后續(xù)兼容性,在新版本中,用新的 name 還是比較好。
sys.all_objects.type字段常用的類型有: P = 存儲(chǔ)過程、V = 視圖、U = 表(用戶定義類型)、TT = 表類型 、AF = 聚合函數(shù)等。
sys.sql_modules.definition返回的就是定義存儲(chǔ)過程或視圖的腳本。
獲取表的字段信息
1、如果單純獲取字段名稱,只需要用到系統(tǒng)表syscolumns。
- select * from syscolumns where id=object_id('表名')
2、如果要獲取字段和對(duì)應(yīng)的數(shù)據(jù)類型,需要用到系統(tǒng)表syscolumns和systypes。
- select a.name as [column],b.name as type
- from syscolumns a,systypes b
- where a.id=object_id('表名') and a.xtype=b.xtype

3、獲取更詳細(xì)的表結(jié)構(gòu)信息,調(diào)用[INFORMATION_SCHEMA].[COLUMNS]。
- SELECT c.TABLE_SCHEMA ,
- c.TABLE_NAME ,
- c.COLUMN_NAME ,
- c.DATA_TYPE ,
- c.CHARACTER_MAXIMUM_LENGTH ,
- c.COLUMN_DEFAULT ,
- c.IS_NULLABLE ,
- c.NUMERIC_PRECISION ,
- c.NUMERIC_SCALE
- FROM [INFORMATION_SCHEMA].[COLUMNS] c
- WHERE TABLE_NAME = 'idata'

如果您能夠活用這些系統(tǒng)內(nèi)置的表、視圖和存儲(chǔ)過程,您總可以找到方法方便的查到想要知道的數(shù)據(jù)元素信息。
希望對(duì)您有所幫助!