數據字典生成工具之旅(8):SQL查詢表的約束默認值等信息


      上一篇代碼生成工具里面已經用到了讀取表結構的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 視圖
 
 5.sp_helptext(查看函數,視圖,存儲過程創建語句的系統存儲過程)
  知道一個存儲過程名稱,如何找到這個存儲過程的創建語句呢,別着急這個時候sp_helptext派上用場了,請看下面SQL,其中fn_Spilt為函數名稱
 
sp_helptext fn_Spilt

  創建語句就知道了,這里提供另外一個好的工具,書寫SQL和提示方面更加智能SQL Prompt在做數據庫開發時提效不只是一點點哦,這里上幾張截圖,有關該工具詳細介紹可以參考SQL Prompt——SQL智能提示插件這篇介紹。

 

 

實際應用

   介紹完上面幾個重要的視圖以后,這里介紹一下這些視圖的實際作用。

  1. 創建可重復執行的語句
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 來進行查詢。

 

  

工具源代碼下載

      目前總共有經過了七個版本的升級,現在提供最新版本的下載地址

學習使用

      如果你使用了該工具,或者想學習該工具,歡迎加入這個小組,一起討論數據字典生成工具、把該工具做的更強,更方便使用,一起加入147425783 QQ群

      更多數據字典生成工具資料請點擊數據字典生成工具專題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM