mssql生成数据库字典脚本

解决问题:

1、数据库字段变动每次都需要修改字典。

2、开发中其他原因导致遗忘修改字典。

解决方案

1、脚本

  1 SET ANSI_NULLS ON;
  2 GO
  3 SET QUOTED_IDENTIFIER ON;
  4 GO
  5 -- =============================================
  6 -- Author: <mrlm>
  7 -- Create date: <2015-3-13>
  8 -- Description: <生成数据库字典>
  9 -- =============================================
 10 
 11 SET NOCOUNT ON;
 12 /*
 13 *输出头部信息
 14 */
 15 PRINT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
 16 PRINT '<html xmlns="http://www.w3.org/1999/xhtml">';
 17 PRINT ' <head>';
 18 PRINT ' <title>数据库字典</title>';
 19 PRINT ' <style type="text/css">';
 20 PRINT ' body{margin:0;cursor:default;font-family: Arial, Helvetica, sans-serif, "微软雅黑" , "宋体";}';
 21 PRINT ' .tableBox{margin:10px auto; padding:0px; width:1200px; height:auto; background:#EAEFF3; border:1px solid #45360A; margin-top:50px;}';
 22 PRINT ' .tableBox h3 {font-size:12pt; height:30px; line-height:30px; background:#460B6A; padding:0px 0px 0px 15px; color:#FFF; margin:0px; text-align:left }';
 23 PRINT ' .tableBox table {width:1200px; padding:0px }';
 24 PRINT ' .tableBox th {height:25px; border-top:1px solid #FFF; border-left:1px solid #FFF; background:#C0DBF7; font-size:14px; }';
 25 PRINT ' .tableBox td {font-size: 12px;height:25px; padding-left:10px; border-top:1px solid #FFF; border-left:1px solid #FFF; }';
 26 PRINT ' .tableBox tr:hover { background:#C0DBF7; } ';
 27 PRINT ' .tableBox .field{font-weight:bold;color:#276926;}';
 28 PRINT ' </style>';
 29 PRINT ' </head>';
 30 PRINT ' <body>';
 31 PRINT '<div style="text-align:center;"><h2>' + DB_NAME()
 32     + ' 数据库字典</h2></br><font style="color:gray;">生成于:'
 33     + CONVERT(VARCHAR, GETDATE(), 120) + '</font></div></br>';
 34 
 35 /*
 36 *数据库菜单列表
 37 */
 38 --数据库表
 39 DECLARE @tableDBTABLE TABLE
 40     (
 41       id INT IDENTITY(1, 1)
 42              PRIMARY KEY ,
 43       tableName NVARCHAR(300)
 44     );
 45 
 46 
 47 INSERT  INTO @tableDBTABLE
 48         ( tableName
 49         )
 50         SELECT DISTINCT
 51                 TABLE_NAME AS tableName
 52         FROM    INFORMATION_SCHEMA.COLUMNS
 53         WHERE   ( SELECT    COUNT(*)
 54                   FROM      sys.tables AS tbl
 55                             INNER JOIN sys.all_columns AS clmns ON clmns.object_id = tbl.object_id
 56                             LEFT OUTER JOIN sys.indexes AS idx ON idx.object_id = clmns.object_id
 57                                                               AND 1 = idx.is_primary_key
 58                             LEFT OUTER JOIN sys.index_columns AS idxcol ON idxcol.index_id = idx.index_id
 59                                                               AND idxcol.column_id = clmns.column_id
 60                                                               AND idxcol.object_id = clmns.object_id
 61                                                               AND 0 = idxcol.is_included_column
 62                             LEFT OUTER JOIN sys.types AS udt ON udt.user_type_id = clmns.user_type_id
 63                             LEFT OUTER JOIN sys.types AS typ ON typ.user_type_id = clmns.system_type_id
 64                                                               AND typ.user_type_id = typ.system_type_id
 65                             LEFT JOIN sys.default_constraints AS cnstr ON cnstr.object_id = clmns.default_object_id
 66                             LEFT OUTER JOIN sys.extended_properties exprop ON exprop.major_id = clmns.object_id
 67                                                               AND exprop.minor_id = clmns.column_id
 68                                                               AND exprop.name = 'MS_Description'
 69                   WHERE     ( tbl.name = TABLE_NAME
 70                               AND exprop.class = 1
 71                             )
 72                 ) > 0
 73         ORDER BY TABLE_NAME;
 74 
 75 --输出表目录信息
 76 DECLARE @tname_cur VARCHAR(200);
 77 DECLARE @count_t1 INT;
 78 DECLARE @i_t1 INT;
 79 DECLARE @i_t2 INT;
 80 
 81 DECLARE @字段名称 VARCHAR(200);
 82 DECLARE @类型 VARCHAR(200);
 83 DECLARE @长度 VARCHAR(200);
 84 DECLARE @数值精度 VARCHAR(200);
 85 DECLARE @小数位数 VARCHAR(200);
 86 DECLARE @默认值 VARCHAR(200);
 87 DECLARE @允许为空 VARCHAR(200);
 88 DECLARE @外键 VARCHAR(200);
 89 DECLARE @主键 VARCHAR(200);
 90 DECLARE @描述 VARCHAR(4000);
 91 
 92 --初始化值
 93 SET @i_t1 = 1;
 94 SET @i_t2 = 1;
 95 SELECT  @count_t1 = COUNT(*)
 96 FROM    @tableDBTABLE;
 97 
 98 
 99 IF @count_t1 > 0
100     BEGIN
101         PRINT '<div style="text-align:left; margin:20px 0px 50px 50px;"> 目录:<br><ol>'; 
102         WHILE @i_t1 <= @count_t1
103             BEGIN
104                 SELECT  @tname_cur = tableName
105                 FROM    @tableDBTABLE
106                 WHERE   id = @i_t1;
107                 PRINT '<li><a href="#' + @tname_cur + '">表:' + @tname_cur
108                     + '</a></li>';
109                 SET @i_t1 = @i_t1 + 1;
110             END;
111         PRINT '</ol></div>';
112     END;
113 --输出表行信息
114 IF @count_t1 > 0
115     BEGIN
116         SET @i_t1 = 1; 
117         WHILE @i_t1 <= @count_t1
118             BEGIN 
119                 SELECT  @tname_cur = tableName
120                 FROM    @tableDBTABLE
121                 WHERE   id = @i_t1;
122 
123                 DECLARE @tabledesc NVARCHAR(4000);--表描述
124                 SELECT  @tabledesc = CAST(value AS VARCHAR(4000))
125                 FROM    sys.extended_properties AS A
126                 WHERE   A.major_id = OBJECT_ID(@tname_cur)
127                         AND name = 'MS_Description'
128                         AND minor_id = 0;
129                 SET @tabledesc = CASE WHEN ( @tabledesc IS NULL
130                                              OR LEN(RTRIM(LTRIM(@tabledesc))) <= 0
131                                            ) THEN ' '
132                                       ELSE ' : ' + @tabledesc
133                                  END; 
134 
135 --输出表头部信息
136                 PRINT ' <div class="tableBox">'; 
137                 PRINT '<a name="' + @tname_cur + '"></a>'; 
138                 PRINT ' <h3>' + CAST(@i_t1 AS VARCHAR(10)) + '.' + @tname_cur
139                     + '' + @tabledesc + '</h3>'; 
140                 PRINT ''; 
141 
142                 PRINT ' <table cellspacing="0">';
143                 PRINT ' <tr>';
144                 PRINT ' <th>序号</th>';
145                 PRINT ' <th>字段名称</th>';
146                 PRINT ' <th>类型</th>';
147                 PRINT ' <th>长度</th>';
148                 PRINT ' <th>数值精度</th>';
149                 PRINT ' <th>小数位数</th>';
150                 PRINT ' <th>默认值</th>';
151                 PRINT ' <th>允许为空</th>';
152                 PRINT ' <th>外键</th>';
153                 PRINT ' <th>主键</th>';
154                 PRINT ' <th>描述</th>';
155                 PRINT ' </tr>';
156 
157                 DECLARE TRows CURSOR
158                 FOR
159                     SELECT  ' <td class="field">'
160                             + CAST(clmns.name AS VARCHAR(35)) + '</td>' ,
161                             ' <td>' + CAST(udt.name AS CHAR(15)) + '</td>' ,
162                             ' <td>'
163                             + CAST(CAST(CASE WHEN typ.name IN ( N'nchar',
164                                                               N'nvarchar' )
165                                                   AND clmns.max_length <> -1
166                                              THEN clmns.max_length / 2
167                                              ELSE clmns.max_length
168                                         END AS INT) AS VARCHAR(20)) + '</td>' ,
169                             ' <td>'
170                             + CAST(CAST(clmns.precision AS INT) AS VARCHAR(20))
171                             + '</td>' ,
172                             ' <td>'
173                             + CAST(CAST(clmns.scale AS INT) AS VARCHAR(20))
174                             + '</td>' ,
175                             ' <td>'
176                             + ISNULL(CAST(cnstr.definition AS VARCHAR(20)), '')
177                             + '</td>' ,
178                             ' <td>'
179                             + ( CASE WHEN clmns.is_nullable = 1 THEN ''
180                                      ELSE ''
181                                 END ) + '</td>' ,
182                             ' <td>'
183                             + ( CASE WHEN clmns.is_computed = 1 THEN ''
184                                      ELSE ''
185                                 END ) + '</td>' ,
186                             ' <td>'
187                             + ( CASE WHEN clmns.is_identity = 1 THEN ''
188                                      ELSE ''
189                                 END ) + '</td>' ,
190                             ' <td style="">'
191                             + ISNULL(CAST(exprop.value AS VARCHAR(500)), '')
192                             + '</td>'
193                     FROM    sys.tables AS tbl
194                             INNER JOIN sys.all_columns AS clmns ON clmns.object_id = tbl.object_id
195                             LEFT OUTER JOIN sys.indexes AS idx ON idx.object_id = clmns.object_id
196                                                               AND 1 = idx.is_primary_key
197                             LEFT OUTER JOIN sys.index_columns AS idxcol ON idxcol.index_id = idx.index_id
198                                                               AND idxcol.column_id = clmns.column_id
199                                                               AND idxcol.object_id = clmns.object_id
200                                                               AND 0 = idxcol.is_included_column
201                             LEFT OUTER JOIN sys.types AS udt ON udt.user_type_id = clmns.user_type_id
202                             LEFT OUTER JOIN sys.types AS typ ON typ.user_type_id = clmns.system_type_id
203                                                               AND typ.user_type_id = typ.system_type_id
204                             LEFT JOIN sys.default_constraints AS cnstr ON cnstr.object_id = clmns.default_object_id
205                             LEFT OUTER JOIN sys.extended_properties exprop ON exprop.major_id = clmns.object_id
206                                                               AND exprop.minor_id = clmns.column_id
207                                                               AND exprop.name = 'MS_Description'
208                     WHERE   ( tbl.name = @tname_cur
209                               AND exprop.class = 1
210                             )
211                     ORDER BY clmns.column_id ASC;
212 
213                 SET @i_t2 = 1;
214                 OPEN TRows;
215                 FETCH NEXT FROM TRows INTO @字段名称, @类型, @长度, @数值精度, @小数位数, @默认值,
216                     @允许为空, @外键, @主键, @描述;
217 
218 --输出表行数据
219                 WHILE @@FETCH_STATUS = 0
220                     BEGIN
221                         PRINT ' <tr>';
222                         PRINT ' <td>' + CAST(@i_t2 AS VARCHAR(10)) + '</td>';
223                         PRINT @字段名称;
224                         PRINT @类型;
225                         PRINT @长度;
226                         PRINT @数值精度;
227                         PRINT @小数位数;
228                         PRINT @默认值;
229                         PRINT @允许为空;
230                         PRINT @外键;
231                         PRINT @主键;
232                         PRINT @描述;
233                         PRINT ' </tr>';
234                         FETCH NEXT FROM TRows INTO @字段名称, @类型, @长度, @数值精度,
235                             @小数位数, @默认值, @允许为空, @外键, @主键, @描述;
236                         SET @i_t2 = @i_t2 + 1;
237                     END;
238                 CLOSE TRows;
239                 DEALLOCATE TRows;
240                 PRINT '<tr><td colspan="11" style="text-align:right"><a href="#top">TOP↑</a></td></tr>'; 
241                 PRINT ' </table>';
242                 PRINT ' </div>'; 
243 
244                 SET @i_t1 = @i_t1 + 1; 
245             END; 
246     END; 
247 PRINT ' </body>';
248 PRINT '</html>';
249 SET NOCOUNT OFF;

2、添加注释

 2.1、表注释

 2.2、字段注释

3、运行脚本生成html脚本,复制脚本保存到html文件中打开就是数据字典了

 

   展示效果

 

posted @ 2018-01-04 11:11  纸飞机的青春  阅读(377)  评论(0)    收藏  举报