zoukankan      html  css  js  c++  java
  • MS SQL生成数据库字典脚本

      开发一个项目时都会有一个蛋疼的问题——写数据库需求文档,然后根据这个文档来建数据库,如果后来需求改了,要改数据库还要改文档,有时忙着忙着就忘改了,导致文档是过期的。那么我们自己写个脚本在数据库运行直接生产数据字典,这样只要改数据库就行了。目前在网上搜了下,发现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; 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 {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文件即可

    效果展示:

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/marlonBlog/p/7850179.html
Copyright © 2011-2022 走看看