上一篇代碼生成工具里面已經用到了讀取表結構的SQL,這篇將更加詳細的介紹SQL SERVER常用的幾張系統表和視圖!
閱讀目錄
系統表視圖介紹
1.sys.tables(用戶表)
SELECT name,object_id FROM sys.tables
上面SQL是用來查詢數據庫里面所有用戶創建的表,name為表名,object_id為表的對象id。其中object_id的值也可以用系統函數OBJECT_ID()來取
SELECT OBJECT_ID('Other')
可以看到兩者的值是一樣的。
2.sys.views(用戶視圖)
SELECT * FROM sys.views
可以看到結果集中也是包含object_id這一列的,並且這個值也是不相同的,相當於主鍵列。后面會用到這一點。
3.sys.columns(列視圖)
SELECT * FROM sys.columns
sys.tables和sys.columns是通過object_id這一列進行關聯的。說了幾個視圖相信大家都有了直觀的印象,會不會有這個疑問有沒有這樣一個視圖能知道系統所有的數據對象呢,答案是肯定的。
4.sys.objects(數據對象視圖)
SELECT name,object_id,type FROM sys.objects
我這里特意標紅了type這一列,type常用的值及含義
FN | 標量函數 |
P | 存儲過程 |
PK | 主鍵 |
TF | 表值函數 |
U | 用戶表 |
V | 視圖 |
sp_helptext fn_Spilt
創建語句就知道了,這里提供另外一個好的工具,書寫SQL和提示方面更加智能SQL Prompt,在做數據庫開發時提效不只是一點點哦,這里上幾張截圖,有關該工具詳細介紹可以參考SQL Prompt——SQL智能提示插件這篇介紹。
實際應用
介紹完上面幾個重要的視圖以后,這里介紹一下這些視圖的實際作用。
- 創建可重復執行的語句
IF NOT EXISTS(SELECT 1 FROM sys.objects WHERE object_id=object_id('Test')) BEGIN CREATE TABLE Test( num INT ) END
通過判斷sys.objects視圖是否存在test對象來決定是否創建表,這樣就算SQL一直執行都不會報錯了。
2. 清空數據庫表數據
要清空一個表的數據很簡單,直接執行下面SQL即可。可是表多了呢,復制粘貼肯定很麻煩。這個時候sys.tables可以幫上忙了。
TRUNCATE TABLE dbo.myuser
DECLARE @Total AS INT DECLARE @i AS INT DECLARE @name AS VARCHAR(200) SELECT name,IDENTITY(INT,1,1) AS Id INTO #TempDelTable FROM sys.tables SELECT @Total=COUNT(1),@i=1 FROM #TempDelTable WHILE @i<=@Total BEGIN SELECT @name=name FROM #TempDelTable WHERE Id=@i EXEC('TRUNCATE TABLE '+@name) SELECT @i=@i+1 END DROP TABLE #TempDelTable
3. 查詢表的相關信息(表中文名,字段中文名,是否主鍵....)
如何通過SQL來直觀的查詢出表的字段相關信息呢,下面提供SQL
GO IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id=object_id('fn_DataDic')) BEGIN DROP FUNCTION dbo.fn_DataDic END GO CREATE FUNCTION [dbo].[fn_DataDic](@table_name VARCHAR(50)) RETURNS @Result TABLE( table_name VARCHAR(100),--表英文名-- table_name_c VARCHAR(100),--表中文名-- field_name VARCHAR(100), --列名-- field_name_c VARCHAR(100), --列名中文名-- file_sequence INT,--列順序-- id VARCHAR(100),--表的id-- colid VARCHAR(100),--列的id-- date_type VARCHAR(50),--數據類型-- width INT,--數據寬度-- pk bit,--是否主鍵-- defaultvalue VARCHAR(100),--默認值-- isnullable bit, --是否可空-- isidentity bit --是否主動增長-- ) AS /************************************************************** *函數功能:查詢數據庫中用戶表和視圖的數據字典 *輸入參數: @table_name:表名 如果為NULL或''則查詢所有的表或視圖 *返回值: table_name VARCHAR(100),--表英文名-- table_name_c VARCHAR(100),--表中文名-- field_name VARCHAR(100), --列名-- field_name_c VARCHAR(100), --列名中文名-- file_sequence INT,--列順序-- id VARCHAR(100),--表的id-- colid VARCHAR(100),--列的id-- date_type VARCHAR(50),--數據類型-- width INT,--數據寬度-- pk bit,--是否主鍵-- defaultvalue VARCHAR(100),--默認值-- isnullable bit, --是否可空-- isidentity bit --是否主動增長-- *2013-03-29__dudj__創建 ***************************************************************/ BEGIN IF @table_name IS NULL OR LTRIM(RTRIM(@table_name))='' BEGIN INSERT INTO @Result SELECT T.name AS table_name, '' AS table_name_c, C.name AS field_name, '' AS field_name_c, C.colorder AS file_sequence, C.id AS id, C.colid AS colid, TYPE_NAME(C.xtype) AS date_type, C.length AS width, convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in ( select name from sysindexes where indid in( select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) AS pk, ISNULL(CM.text,'') AS defaultvalue, ISNULL(C.isnullable,1) AS isnullable, ISNULL(COLUMNPROPERTY(c.id,c.name,'IsIdentity'),0) AS isidentity FROM sysobjects AS T LEFT JOIN syscolumns AS C ON c.id=T.id LEFT JOIN syscomments CM on c.cdefault=CM.id WHERE T.xtype IN ('U','V') END ELSE BEGIN INSERT INTO @Result SELECT T.name AS table_name, '' AS table_name_c, C.name AS field_name, '' AS field_name_c, C.colorder AS file_sequence, C.id AS id, C.colid AS colid, TYPE_NAME(C.xtype) AS date_type, C.length AS width, convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in ( select name from sysindexes where indid in( select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) AS pk, ISNULL(CM.text,'') AS defaultvalue, ISNULL(C.isnullable,1) AS isnullable, ISNULL(COLUMNPROPERTY(c.id,c.name,'IsIdentity'),0) AS isidentity FROM sysobjects AS T LEFT JOIN syscolumns AS C ON c.id=T.id LEFT JOIN syscomments CM on c.cdefault=CM.id WHERE T.xtype IN ('U','V') AND (T.NAME=@table_name) END /*更新表名中文,列名中文說明*/ UPDATE @Result SET table_name_c= ( SELECT CONVERT(VARCHAR(100),P.VALUE) FROM sys.extended_properties AS P WHERE P.minor_id=0 AND P.major_id=id ),field_name_c = ( SELECT CONVERT(VARCHAR(100),P.VALUE) FROM sys.extended_properties AS P WHERE P.major_id = id AND P.minor_id = colid ) RETURN END GO
先創建一個視圖,方便以后重復使用,創建好以后這樣使用
SELECT * FROM dbo.fn_DataDic('myuser')
本章總結
通過幾個系統視圖的介紹和實際例子結合,完成了表的詳細信息的取數,數據字典生成工具和代碼生成工具里面都有用到相關內容。介紹到這里或許你會對上圖中的表中文名和列中文名怎么出來的不明白。
這些信息是存儲在拓展屬性這里的,可以通過SELECT * FROM sys.extended_properties 來進行查詢。
工具源代碼下載
目前總共有經過了七個版本的升級,現在提供最新版本的下載地址
數據字典生成工具V2.0安裝程序 | 最新安裝程序 | |
數據字典生成工具源代碼 | 最新源代碼 | |
http://code.taobao.org/svn/DataDicPub | SVN最新源碼共享地址 |
學習使用
如果你使用了該工具,或者想學習該工具,歡迎加入這個小組,一起討論數據字典生成工具、把該工具做的更強,更方便使用,一起加入147425783 QQ群。
更多數據字典生成工具資料請點擊數據字典生成工具專題。