[Tools] 自動化產出個人風格 SQL Server 資料表文件

在專案執行過程中,無法即時維護最新版文件是大家共同的瓶頸,因此若能以加註資料表及欄位描述的方式自動產出文件,就能有效解決文件不斷更新的問題;本文透過自動化工具產出資料表文件,不僅能避掉繁瑣的人工作業,又能依據樣板產出不同風格樣式,大家可以嘗試看看喔!

前言

在系統開發上,最可靠的資料庫結構就是目前正在使用的那個,而你手頭上那份修修補補的文件有很大的機會是過時的,因此最好是在資料庫中就說明一切(包括資料表欄位命名及設計),並在資料表及欄位中加註描述(Description),讓開發接手的人有跡可循,就如同最好的說明文件就是程式本身的道理相同。

不可諱言地資料表說明文件還是有其必要性,因為可以作為快速資料表查閱之參考,另外在專案開發上也需要提供資料表文件來完成交付作業,但此時難道只能靠自己手工撰寫嗎? 既然所有資訊都已經存在資料庫了,我們當然就可以直接交給程式來處理,不應該浪費時間在乏味的抄寫比對上,因此筆者開發了個 DB 文件產生器工具,並可依據樣板產出不同樣式的文件,來滿足不同公司所需的文件風格。以下說明。

 

設計構想

其實程式構想很簡單,就是透過 SchemaInformation 相關資料表串出所需資訊,以下為此文件產生器所使用的SQL語句;由於筆者盡可能地將需資訊都一次串出,因此沒有考量過多效能調教上的問題,所以如果有可以精進的地方再麻煩不吝指導一下囉。

SELECT 
   tb.TABLE_NAME AS 'TableName'
  ,CASE 
    WHEN tb.TABLE_TYPE = 'VIEW'
    THEN (SELECT value 
            FROM sys.fn_listextendedproperty(NULL, 'user', 'dbo', 'view', tb.TABLE_NAME, DEFAULT, DEFAULT)
            WHERE name = 'MS_Description'
            AND objtype = 'VIEW')
    ELSE (SELECT value 
            FROM sys.fn_listextendedproperty(NULL, 'user', 'dbo', 'table', tb.TABLE_NAME, DEFAULT, DEFAULT)
            WHERE name = 'MS_Description'
            AND objtype = 'TABLE')
   END AS 'TableDescription'
  ,tb.TABLE_TYPE AS 'TableType'
  ,col.ORDINAL_POSITION AS 'No'
  ,col.COLUMN_NAME AS 'ColumnName'
  ,col.DATA_TYPE AS 'DataType'
  ,CASE 
    WHEN col.CHARACTER_MAXIMUM_LENGTH = -1
      THEN 'MAX' 
      ELSE LTRIM(STR(col.CHARACTER_MAXIMUM_LENGTH,10))
   END AS 'Length'
  ,col.NUMERIC_SCALE AS 'NumericScale'
  ,col.NUMERIC_PRECISION AS 'NumericPrecision'
  ,col.COLUMN_DEFAULT AS 'Default'
  ,col.IS_NULLABLE AS 'Nullable'   
  ,CASE 
    WHEN COLUMNPROPERTY(object_id(tb.TABLE_NAME), col.COLUMN_NAME, 'IsIdentity') = 1  
      THEN 'YES' 
      ELSE 'NO' 
   END AS 'Identity'  
  ,(SELECT value
      FROM sys.fn_listextendedproperty(NULL, 'schema', 'dbo', 'table', tb.TABLE_NAME, 'column', DEFAULT)
      WHERE name = 'MS_Description'
      AND objtype = 'COLUMN'
      AND objname COLLATE Chinese_Taiwan_Stroke_CI_AS = col.COLUMN_NAME) AS 'Description'
  ,CASE 
    WHEN tbc.CONSTRAINT_NAME is not null  
      THEN 'YES' 
      ELSE 'NO' 
   END AS 'PK' 
  ,tbc.CONSTRAINT_NAME AS ' PkConstraint' 
  ,CASE 
    WHEN kcu1.CONSTRAINT_NAME is not null  
      THEN 'YES' 
      ELSE 'NO' 
   END AS 'FK'  
  ,kcu1.CONSTRAINT_NAME AS ' FkConstraint'
  ,kcu2.TABLE_NAME AS 'FkReferencedTable' 
  ,kcu2.COLUMN_NAME AS 'FkReferencedColumn'

FROM 

  INFORMATION_SCHEMA.TABLES tb
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS col ON (tb.TABLE_NAME = col.TABLE_NAME)
  LEFT JOIN
  (
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu1 
      ON kcu1.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG  
      AND kcu1.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA 
      AND kcu1.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu2 
      ON kcu2.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG  
      AND kcu2.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA 
      AND kcu2.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME 
      AND kcu2.ORDINAL_POSITION = kcu1.ORDINAL_POSITION 
  ) ON (tb.TABLE_NAME = kcu1.TABLE_NAME AND col.COLUMN_NAME = kcu1.COLUMN_NAME)
  LEFT JOIN
  (
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tbc
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS colc 
    ON  colc.CONSTRAINT_NAME = tbc.CONSTRAINT_NAME
    AND colc.TABLE_NAME = tbc.TABLE_NAME
    AND tbc.CONSTRAINT_TYPE = 'PRIMARY KEY' 
  )  ON (tb.TABLE_NAME = tbc.TABLE_NAME AND col.COLUMN_NAME = colc.COLUMN_NAME)

ORDER BY tb.TABLE_NAME, col.ORDINAL_POSITION

執行後所有資訊都正確顯示

有了這些資料後,接著就需要將資料輸出至 Excel 中產生文件;由於筆者考量到每個專案客戶所需要產出文件的 Layout 都不盡相同,因此希望讓用戶可自行決定輸出樣式及欄位,所以選擇以樣板方式來設計產出文件,而樣板主要分為資料表清單(#TableListTemplate)及資料欄位資訊(#TableSchemaTemplate)頁籤,可以依照個人需求調整頁籤內資料呈現的方式,滿足各個專案客戶的文件需求。

資料表清單樣板

資料表欄位資訊樣板

 

操作說明

系統主畫面如上圖所示,操作方式請參考以下說明:

  1. 點選【Setting】來設定連線字串及樣板
  2. 設定後若連線字串與目前設定不同,會自動 Reload 資料表清單
  3. 亦可以手動點選【Reload】從資料庫撈取所有資料表資訊
  4. 於 DB Tables 清單中勾選須列入文件之資料表
  5. 可以點選【Remember Checked Tables】針對目前連線來儲存已勾選資料表項目
  6. 最後點選【Generate Document】產出文件並自動開啟檔案

 

在設定介面中可以維護並選擇所需 Connection 及 Doc Template 項目,儲存後若連線有異動會自動載入新連線的所有資料表;其中針對 Doc Template 的部分可點選 Export 來將樣板文件匯出,並可自行調整所需格式後匯入系統。

在挑選需列入文件的資料表清單後,可以點選【Generate Doc】鍵來產出DB文件;系統預設會在建立完文件後開啟檔案,此時你就可以看到輸出的文件內容如下。

資料表清單頁籤

資料表欄位資訊頁籤

 

自訂樣板

我們可以透過自行設計樣板來滿足不同樣式文件的產出,假設客戶對文件的要求如下:

  • 加入客戶公司Logo
  • 移除不需要顯示的欄位(ex. FK & FK Reference...)
  • 調整欄位資訊上方資料表名稱及描述位置
  • 字體放大且 Header 背景顏色調整

 

此時可以進入 Setting 畫面點選 Export 鍵匯出系統預設 Template 檔案,接著依照需求調整呈現方式如下:

資料表清單樣板

資料表欄位資訊樣板

接著匯入並選擇此自行設計的樣板後,點選【Generate Document】就可以看到文件輸出樣式已如我們調整的呈現,並且保證與資料庫中的資訊是一模模一樣樣,再也不會有圖文不符的情況產生了。

資料表清單頁籤

資料表欄位資訊頁籤

有興趣的朋友可以參考筆者 GitHub 有完整代碼,如果有沒考慮周詳的地方再麻煩提醒。
可執行程式可點選 Template-based DB Document Generator for SQL Server 下載使用。

希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !