好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

利用SQL Server的扩展属性自动生成数据字典

利用SQL Server的扩展属性自动生成数据字典

利用SQL Server的扩展属性自动生成数据字典

可能是我太落伍了,今天才知道SQL2005的扩展属性还可以这么用。

数据字典的重要性就不用多说了,再小的开发团队,甚至只有一个人,这个东西也不可或缺,否则日后发生问题那才要命

以前的数据字典都要单独拿出时间来进行整理,但问题多多,最明显的就是和数据结构的变化不同步,而且耗时费力,效果底下

但稍微有点责任心的数据库维护人员,在编辑数据库对象时,都会习惯性的编写备注描述

以前SQL2K时,表备注、字段备注都是直接写在名称后面,SQL会将这些信息保存到系统表:sysproperties

但到了SQL2005,这些备注都转移到了扩展属性里,类似的,SQL会将这些信息保存到系统表:sys.extended_properties

填写表扩展属性的截图:

在SSMS里,在表或者字段上右键,选“属性”,都可以看到“扩展属性”页,其中:

属性名称建议填写固定值:MS_Description,据说这样可以兼容其他的数据字典工具,方便其提取

属性值可以填写表或者字段的详细备注信息

可以为一个表或者字段添加多个扩展属性。

扩展属性可以跟随数据库备份及还原操作进行传递与分发

那么,如果已经填写了扩展属性,该如何自动生成数据字典呢?

首先需要对SSMS输出的文本格式进行一下变动:

不要选中:在结果集中包括列标题,如图:

然后,新建查询窗口,并选择:以文本格式显示结果,如图:

重点来了,复制以下的T-SQL脚本,并执行:

 Set  nocount  on 
 DECLARE   @TableName   nvarchar ( 35  )
  DECLARE  Tbls  CURSOR 
 FOR 
     Select   distinct   Table_name
      FROM   INFORMATION_SCHEMA.COLUMNS
      --  put any exclusions here 
     --  where table_name not like '%old' 
     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>数据库字典</title>  ' 
 PRINT   '  <style type="text/css">  ' 
 PRINT   '  body{margin:0; font:11pt "arial", "微软雅黑"; cursor:default;}  ' 
 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   '  </style>  ' 
 PRINT   '  </head>  ' 
 PRINT   '  <body>  ' 
 FETCH   NEXT   FROM   Tbls
  INTO   @TableName 
 WHILE   @@FETCH_STATUS   =   0 
 BEGIN 
     PRINT   '  <div class="tableBox">  ' 
     Select   '  <h3>  '   +   @TableName   +   '   :   '  +  cast (Value  as   varchar ( 1000 ))  +   '  </h3>  ' 
     FROM   sys.extended_properties A
      WHERE  A.major_id  =   OBJECT_ID ( @TableName  )
      and  name  =   '  MS_Description  '   and  minor_id  =   0 
     PRINT   '  <table cellspacing="0">  ' 
     --  Get the Description of the table 
     --  Characters 1-250 
     PRINT   '  <tr>  '   --  Set up the Column Headers for the Table 
     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   '  <th>标识列</th>  ' 
     PRINT   '  <th>默认值</th>  ' 
     --  Get the Table Data 
     SELECT   '  </tr><tr>  '  ,
      '  <td>  '   +   CAST (clmns.name  AS   VARCHAR ( 35 ))  +   '  </td>  '  ,
      '  <td>  '   +   ISNULL ( CAST (exprop.value  AS   VARCHAR ( 500 )), '' )  +   '  </td>  '  ,
      '  <td>  '   +   CAST ( ISNULL (idxcol.index_column_id,  0 ) AS   VARCHAR ( 20 ))  +   '  </td>  '  ,
      '  <td>  '   +   CAST ( ISNULL  (
    (  SELECT   TOP   1   1 
     FROM  sys.foreign_key_columns  AS   fkclmn
      WHERE  fkclmn.parent_column_id  =   clmns.column_id
      AND  fkclmn.parent_object_id  =  clmns. object_id  
    ),   0 )  AS   VARCHAR ( 20 ))  +   '  </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>  '   +   CAST (clmns.is_nullable  AS   VARCHAR ( 20 ))  +   '  </td>  '   ,
      '  <td>  '   +   CAST (clmns.is_computed  AS   VARCHAR ( 20 ))  +   '  </td>  '   ,
      '  <td>  '   +   CAST (clmns.is_identity  AS   VARCHAR ( 20 ))  +   '  </td>  '   ,
      '  <td>  '   +   isnull ( CAST (cnstr.definition  AS   VARCHAR ( 20 )), '' )  +   '  </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   and  
    exprop.class   =   1 )  --  I don't wand to include comments on indexes 
     ORDER   BY  clmns.column_id  ASC 
     PRINT   '  </tr></table>  ' 
     PRINT   '  </div>  ' 
     FETCH   NEXT   FROM   Tbls
      INTO   @TableName 
 END 
 PRINT   '  </body></HTML>  ' 
 CLOSE   Tbls
  DEALLOCATE  Tbls

执行完成后,会在结果窗口中打印出一大段HTML代码

复制这段HTML代码,新建一个.htm的WEB文件,粘贴进去,用浏览器打开即可阅读最新版的数据字典!

最终效果截图:

---------------------------------------------------------------------------

一天一天过去了,第三天我想通了 ... ...  

 

分类:  常用工具箱 ,  数据库

标签:  sql ,  扩展属性 ,  数据字典

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于利用SQL Server的扩展属性自动生成数据字典的详细内容...

  阅读:50次