MS SQL生成資料庫字典腳本

来源:http://www.cnblogs.com/marlonBlog/archive/2017/11/17/7850179.html
-Advertisement-
Play Games

開發一個項目時都會有一個蛋疼的問題——寫資料庫需求文檔,然後根據這個文檔來建資料庫,如果後來需求改了,要改資料庫還要改文檔,有時忙著忙著就忘改了,導致文檔是過期的。那麼我們自己寫個腳本在資料庫運行直接生產數據字典,這樣只要改資料庫就行了。目前在網上搜了下,發現sqlServer只有2005的生成工具 ...


  開發一個項目時都會有一個蛋疼的問題——寫資料庫需求文檔,然後根據這個文檔來建資料庫,如果後來需求改了,要改資料庫還要改文檔,有時忙著忙著就忘改了,導致文檔是過期的。那麼我們自己寫個腳本在資料庫運行直接生產數據字典,這樣只要改資料庫就行了。目前在網上搜了下,發現sqlServer只有2005的生成工具,沒有08的,存儲過程倒是有,不過下載運行一遍到處是坑,寫的也太差了,於是對腳本進行改進。

     

-- =============================================
-- Author:        <marlon>
-- Create date: <2017-11-13>
-- Description:    <生成資料庫字典>
-- =============================================

BEGIN
    DECLARE @TableName nvarchar(35),@htmls varchar(8000)
    DECLARE @欄位名稱 VARCHAR(200)
    DECLARE @類型  VARCHAR(200)
    DECLARE @長度 VARCHAR(200)
    DECLARE @數值精度 VARCHAR(200)
    DECLARE @小數位數 VARCHAR(200)
    DECLARE @預設值 VARCHAR(200)
    DECLARE @允許為空 VARCHAR(200)
    DECLARE @外鍵 VARCHAR(200)
    DECLARE @主鍵 VARCHAR(200)
    DECLARE @描述 VARCHAR(200)
    
    SET NOCOUNT ON;

    DECLARE Tbls CURSOR
    FOR
        Select distinct Table_name
        FROM INFORMATION_SCHEMA.COLUMNS
        order by Table_name
    OPEN Tbls
        PRINT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
        PRINT '<html xmlns="http://www.w3.org/1999/xhtml">'
        PRINT '    <head>'
        PRINT '        <title>SqlServer數據字典</title>'
        PRINT '        <style type="text/css">'
        PRINT '            body{margin:0; font:11pt "arial", "微軟雅黑"; cursor:default;}'
        PRINT '            .titleHead{margin:0 auto;text-align:center;}'
        PRINT '            .tableBox{margin:10px auto; padding:0px; width:1000px; height:auto; background:#FBF5E3; border:1px solid #45360A}'
        PRINT '            .tableBox h3 {font-size:12pt; height:30px; line-height:30px; background:#45360A; padding:0px 0px 0px 15px; color:#FFF; margin:0px; text-align:left }'
        PRINT '            .tableBox table {width:1000px; padding:0px }'
        PRINT '            .tableBox th {height:25px; border-top:1px solid #FFF; border-left:1px solid #FFF; background:#F7EBC8; border-right:1px solid #E0C889; border-bottom:1px solid #E0C889 }'
        PRINT '            .tableBox td {height:25px; padding-left:10px; border-top:1px solid #FFF; border-left:1px solid #FFF; border-right:1px solid #E0C889; border-bottom:1px solid #E0C889 }'
        PRINT '            .tableBox td {text-align:center}'
        PRINT '        </style>'
        PRINT '    </head>'
        PRINT '    <body>'
        PRINT '       <div class="titleHead">'
        PRINT '          <h1>'+DB_NAME()+'數據字典</h1>'
        PRINT '       </div>'
    FETCH NEXT FROM Tbls INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
		set @htmls = ''
        Select  @htmls = '        <h3>' + @TableName + ' : '+ CAST(Value as varchar(1000)) + '</h3>'
        FROM sys.extended_properties AS A
        WHERE A.major_id = OBJECT_ID(@TableName)
        and minor_id = 0
         
        if @htmls is null or DATALENGTH (@htmls)=0
            begin
            set @htmls = '        <h3>' + @TableName + '</h3>'
            end
        PRINT '        <div class="tableBox">'
        PRINT @htmls
        PRINT '            <table cellspacing="0">'
        PRINT '                <tr>'
        PRINT '                    <th>欄位名稱</th>'
        PRINT '                    <th>類型</th>'
        PRINT '                    <th>長度</th>'
        PRINT '                    <th>數值精度</th>'
        PRINT '                    <th>小數位數</th>'
        PRINT '                    <th>預設值</th>'
        PRINT '                    <th>是否允許為空</th>'
        PRINT '                    <th>是否外鍵</th>'
        PRINT '                    <th>是否主鍵</th>'
        PRINT '                    <th>描述</th>'
        PRINT '                </tr>'
        
        DECLARE TRows CURSOR
        FOR
            SELECT
            '                    <td>' + CAST(clmns.name AS VARCHAR(35)) + '</td>',
            '                    <td>' + CAST(udt.name AS CHAR(15)) + '</td>' ,
            '                    <td>' + CAST(CAST(CASE WHEN typ.name IN (N'nchar', N'nvarchar') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS INT) AS VARCHAR(20)) + '</td>',
            '                    <td>' + CAST(CAST(clmns.precision AS INT) AS VARCHAR(20)) + '</td>',
            '                    <td>' + CAST(CAST(clmns.scale AS INT) AS VARCHAR(20)) + '</td>',
            '                    <td>' + isnull(CAST(cnstr.definition AS VARCHAR(20)),'') + '</td>',
            '                    <td>' + (case when clmns.is_nullable > 0 then '是' else '否' end) + '</td>' ,
            '                    <td>' + (case when clmns.is_computed > 0 then '是' else '否' end) + '</td>' ,
            '                    <td>' + (case when clmns.is_identity > 0 then '是' else '否' end) + '</td>' ,
            '                    <td>' + ISNULL(CAST(exprop.value AS VARCHAR(500)),'') + '</td>'
            FROM sys.tables AS tbl 
            INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
            LEFT OUTER JOIN sys.indexes AS idx ON idx.object_id = clmns.object_id AND 1 =idx.is_primary_key
            LEFT OUTER JOIN sys.index_columns AS idxcol ON idxcol.index_id = idx.index_id AND idxcol.column_id = clmns.column_id AND idxcol.object_id = clmns.object_id AND 0 = idxcol.is_included_column
            LEFT OUTER JOIN sys.types AS udt ON udt.user_type_id = clmns.user_type_id
            LEFT OUTER JOIN sys.types AS typ ON typ.user_type_id = clmns.system_type_id AND typ.user_type_id = typ.system_type_id
            LEFT JOIN sys.default_constraints AS cnstr ON cnstr.object_id=clmns.default_object_id
            LEFT OUTER JOIN sys.extended_properties exprop ON exprop.major_id = clmns.object_id AND exprop.minor_id = clmns.column_id AND exprop.name = 'MS_Description'
            WHERE (tbl.name = @TableName) 
            ORDER BY clmns.column_id ASC        
        OPEN TRows
        FETCH NEXT FROM TRows INTO @欄位名稱,@類型,@長度,@數值精度,@小數位數,@預設值,@允許為空,@外鍵,@主鍵,@描述
        WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT '                <tr>'
            PRINT @欄位名稱
            PRINT @類型
            PRINT @長度
            PRINT @數值精度
            PRINT @小數位數
            PRINT @預設值
            PRINT @允許為空
            PRINT @外鍵
            PRINT @主鍵
            PRINT @描述
            PRINT '                </tr>'
            FETCH NEXT FROM TRows INTO @欄位名稱,@類型,@長度,@數值精度,@小數位數,@預設值,@允許為空,@外鍵,@主鍵,@描述
        END
        CLOSE TRows
        DEALLOCATE TRows

        PRINT '            </table>'
        PRINT '        </div>'
    FETCH NEXT FROM Tbls INTO @TableName
    END
        PRINT '    </body>'
        PRINT '</html>'
    CLOSE Tbls
    DEALLOCATE Tbls
END

  註意事項:

  1、以上腳本直接在SQL SERVER運行,以文本格式顯示,設置如下:

  

  紅框的不要勾選

     2、如果要加註釋,表的註釋在這裡加

 欄位的註釋:

 3、生成後保存為HTML文件即可

 

效果展示:

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python自動安裝mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安裝目錄路徑和數據目錄路徑都是固定,當然也可以自己修改 這個腳本的原理是,通過createmycnf.sh的shell腳本生成my.cnf,buf ...
  • Redhat6.5 1、準備工作 卸載使用rpm包安裝的mysql-server、mysql軟體包 安裝自帶的ncurses-devel包 rpm -ivh /mnt/Packages/ncurses-devel-5.7-3.20090208.el6.x86_64.rpm ① 解壓cmake包 ta ...
  • 準備兩台設備,以我的為例一臺source ip:192.168.3.66和一臺duplicate ip:192.168.3.77 1》基於備份集複製資料庫,目錄結構都一樣(active database網路) 1.在duplicate端檢查有沒有亞參文件(如果沒有的話就創建) cd $ORACLE_ ...
  • 操作系統 :CentOS7.3.1611_x64 PostgreSQL版本 :9.6 問題描述 在InfluxDB中存儲時序數據時,當tag值和時間戳都相同時會執行覆蓋操作。在PostgreSQL中能不能這麼用呢? 解決方案 可以藉助唯一索引和update來實現,這裡記錄下以備後用。 1、創建帶有唯 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/7851294.html 在做資料庫的異常診斷的時候,之前在SQL Server上的時候,最主要的參考信息之一就是去看當前的活動Session有哪些,這些活動Session分別在執行什麼語句,用的什麼執行方式(計劃),運行了多久 ...
  • 在寫之前交代一下背景吧! 做開發也好久了,沒怎麼整理過知識,現在剖析一下自己對資料庫事務的認識,以前用sqlserver,現在轉java後又用mysql、oracle。我這塊就主要解釋一下mysql資料庫事務。其實好多內容適用於各種標準資料庫! 直接就進入正文了! 不管是做啥都有理論知識,我在這塊也 ...
  • 連接池中的參數介紹: name:表示你的連接池的名稱也就是你要訪問連接池的地址 auth:是連接池管理權屬性,Container表示容器管理 type:是對象的類型 driverClassName:是資料庫驅動的名稱 url:是資料庫的地址 username:是登陸資料庫的用戶名 password: ...
  • 1、收集統計信息vacuum full analyze ZCXT.ZCOT_PS_PROJECT; 2、檢查表的數據量分佈select gp_segment_id,count(*) from fact_table group by gp_segment_id; 3、表結構上建議創建表的時候,分佈鍵放 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...