不用工具生成数据库字典(转)

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

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

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

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

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

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

填写表扩展属性的截图:

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

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

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

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

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

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

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

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

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

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

[sql] view plaincopyprint?

  1. Set nocount on
  2. DECLARE @TableName nvarchar(35)
  3. DECLARE Tbls CURSOR
  4. FOR
  5. Select distinct Table_name
  6. FROM INFORMATION_SCHEMA.COLUMNS
  7. --put any exclusions here
  8. --where table_name not like ‘%old‘
  9. order by Table_name
  10. OPEN Tbls
  11. PRINT ‘<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">‘
  12. PRINT ‘<html xmlns="http://www.w3.org/1999/xhtml">‘
  13. PRINT ‘<head>‘
  14. PRINT ‘<title>数据库字典</title>‘
  15. PRINT ‘<style type="text/css">‘
  16. PRINT ‘body{margin:0; font:11pt "arial", "微软雅黑"; cursor:default;}‘
  17. PRINT ‘.tableBox{margin:10px auto; padding:0px; width:1000px; height:auto; background:#FBF5E3; border:1px solid #45360A}‘
  18. 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 }‘
  19. PRINT ‘.tableBox table {width:1000px; padding:0px }‘
  20. 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 }‘
  21. 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 }‘
  22. PRINT ‘</style>‘
  23. PRINT ‘</head>‘
  24. PRINT ‘<body>‘
  25. FETCH NEXT FROM Tbls
  26. INTO @TableName
  27. WHILE @@FETCH_STATUS = 0
  28. BEGIN
  29. PRINT ‘<div class="tableBox">‘
  30. Select ‘<h3>‘ + @TableName + ‘ : ‘+cast(Value as varchar(1000)) + ‘</h3>‘
  31. FROM sys.extended_properties A
  32. WHERE A.major_id = OBJECT_ID(@TableName)
  33. and name = ‘MS_Description‘ and minor_id = 0
  34. PRINT ‘<table cellspacing="0">‘
  35. --Get the Description of the table
  36. --Characters 1-250
  37. PRINT ‘<tr>‘ --Set up the Column Headers for the Table
  38. PRINT ‘<th>字段名称</th>‘
  39. PRINT ‘<th>描述</th>‘
  40. PRINT ‘<th>主键</th>‘
  41. PRINT ‘<th>外键</th>‘
  42. PRINT ‘<th>类型</th>‘
  43. PRINT ‘<th>长度</th>‘
  44. PRINT ‘<th>数值精度</th>‘
  45. PRINT ‘<th>小数位数</th>‘
  46. PRINT ‘<th>允许为空</th>‘
  47. PRINT ‘<th>计算列</th>‘
  48. PRINT ‘<th>标识列</th>‘
  49. PRINT ‘<th>默认值</th>‘
  50. --Get the Table Data
  51. SELECT ‘</tr><tr>‘,
  52. ‘<td>‘ + CAST(clmns.name AS VARCHAR(35)) + ‘</td>‘,
  53. ‘<td>‘ + ISNULL(CAST(exprop.value AS VARCHAR(500)),‘‘) + ‘</td>‘,
  54. ‘<td>‘ + CAST(ISNULL(idxcol.index_column_id, 0)AS VARCHAR(20)) + ‘</td>‘,
  55. ‘<td>‘ + CAST(ISNULL(
  56. (SELECT TOP 1 1
  57. FROM sys.foreign_key_columns AS fkclmn
  58. WHERE fkclmn.parent_column_id = clmns.column_id
  59. AND fkclmn.parent_object_id = clmns.object_id
  60. ), 0) AS VARCHAR(20)) + ‘</td>‘,
  61. ‘<td>‘ + CAST(udt.name AS CHAR(15)) + ‘</td>‘ ,
  62. ‘<td>‘ + CAST(CAST(CASE WHEN typ.name IN (N‘nchar‘, N‘nvarchar‘) AND clmns.max_length <> -1
  63. THEN clmns.max_length/2
  64. ELSE clmns.max_length END AS INT) AS VARCHAR(20)) + ‘</td>‘,
  65. ‘<td>‘ + CAST(CAST(clmns.precision AS INT) AS VARCHAR(20)) + ‘</td>‘,
  66. ‘<td>‘ + CAST(CAST(clmns.scale AS INT) AS VARCHAR(20)) + ‘</td>‘,
  67. ‘<td>‘ + CAST(clmns.is_nullable AS VARCHAR(20)) + ‘</td>‘ ,
  68. ‘<td>‘ + CAST(clmns.is_computed AS VARCHAR(20)) + ‘</td>‘ ,
  69. ‘<td>‘ + CAST(clmns.is_identity AS VARCHAR(20)) + ‘</td>‘ ,
  70. ‘<td>‘ + isnull(CAST(cnstr.definition AS VARCHAR(20)),‘‘) + ‘</td>‘
  71. FROM sys.tables AS tbl INNER JOIN sys.all_columns AS clmns
  72. ON clmns.object_id=tbl.object_id
  73. LEFT OUTER JOIN sys.indexes AS idx
  74. ON idx.object_id = clmns.object_id
  75. AND 1 =idx.is_primary_key
  76. LEFT OUTER JOIN sys.index_columns AS idxcol
  77. ON idxcol.index_id = idx.index_id
  78. AND idxcol.column_id = clmns.column_id
  79. AND idxcol.object_id = clmns.object_id
  80. AND 0 = idxcol.is_included_column
  81. LEFT OUTER JOIN sys.types AS udt
  82. ON udt.user_type_id = clmns.user_type_id
  83. LEFT OUTER JOIN sys.types AS typ
  84. ON typ.user_type_id = clmns.system_type_id
  85. AND typ.user_type_id = typ.system_type_id
  86. LEFT JOIN sys.default_constraints AS cnstr
  87. ON cnstr.object_id=clmns.default_object_id
  88. LEFT OUTER JOIN sys.extended_properties exprop
  89. ON exprop.major_id = clmns.object_id
  90. AND exprop.minor_id = clmns.column_id
  91. AND exprop.name = ‘MS_Description‘
  92. WHERE (tbl.name = @TableName and
  93. exprop.class = 1) --I don‘t wand to include comments on indexes
  94. ORDER BY clmns.column_id ASC
  95. PRINT ‘</tr></table>‘
  96. PRINT ‘</div>‘
  97. FETCH NEXT FROM Tbls
  98. INTO @TableName
  99. END
  100. PRINT ‘</body></HTML>‘
  101. CLOSE Tbls
  102. DEALLOCATE Tbls

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

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

最终效果截图:

时间: 2024-08-08 14:49:26

不用工具生成数据库字典(转)的相关文章

自动生成数据库字典(sql2008) 转自 飘渺の云海

每次做项目的时候都要做数据字典,这种重复的工作实在很是痛苦,于是广找资料,终于完成了自动生成数据库字典的工作,废话少说,上代码. 截取一部分图片: 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Carbe> -- Create date: <2014-09-19> -- Description: &

自动生成数据库字典(sql2008)

每次做项目的时候都要做数据字典,这种重复的工作实在很是痛苦,于是广找资料,终于完成了自动生成数据库字典的工作,废话少说,上代码. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Carbe> -- Create date: <2014-09-19> -- Description: <生成数据库字

MS SQL生成数据库字典脚本

开发一个项目时都会有一个蛋疼的问题--写数据库需求文档,然后根据这个文档来建数据库,如果后来需求改了,要改数据库还要改文档,有时忙着忙着就忘改了,导致文档是过期的.那么我们自己写个脚本在数据库运行直接生产数据字典,这样只要改数据库就行了.目前在网上搜了下,发现sqlServer只有2005的生成工具,没有08的,存储过程倒是有,不过下载运行一遍到处是坑,写的也太差了,于是对脚本进行改进. -- ============================================= -- Au

SQL Server2008生成数据库字典

1.我们在开发过程中可能会遇到这样的一种情况"当我们进行维护其他人的项目时或者项目的二次开发时可能会对原始的数据表进行分析",这里为大家介绍一种方便快捷生成数据库字典的方式. 我们在数据表中右键,选择属性 在名称这项添加一个"MS_Description",需要注意的是必须在数据表上添加扩展数据,数据库的扩展属性添加上没用,当然有多张数据表的时候我们要对每张数据表添加这样一个值,如果数据表多了我们这样去做是不是觉得很麻烦呢.这里我们想到使用"游标的方式&q

用powerdesigner建模工具生成数据库

1,使用powerdesignerP:主键 F:外键 M:是否可为空 2,两张表建立主外键关系时,主外键名称要相同.比如A表 A_id name  说明id(P) B表 B_id name  说明id(P) 此时要把B表中的B_id设置为A表的外键,则要在A表中添加一个名称为B_id的字段 3,建模完成之后,就可以生成数据库文件了,点击Database----Generate Database----选择文件保存路径,定义文件名(默认为:t_carsell.sql)----确定 这个文件是pow

用PDMReader工具生成数据库设计文档(转载)

来源:http://blog.csdn.net/xinglun88/article/details/19987719 第一步:下载并安装PDMReader,资源网站: http://www.pdmreader.com/ 第二步:打开PDMReader,新建项目:test: 第三步:在项目test点击右键,选择"导入数据字典",然后点击"导入PDM"图标(点击图标而不是文字),系统打开选择pdm文件对话框: 第四步:在项目test下选中你的pdm文件,在右面会出现所有

使用Navicat快速生成数据库字典

可参考地址:https://blog.csdn.net/maquealone/article/details/60764420 转载申明地址:http://blog.itpub.net/15498/viewspace-2134152 方法如下:利用mysql的information_schema 库中的COLUMNS表信息来实现例如需要导出ixinnuo_zxpt库的数据字典信息:打开Navicat,选择查询-->新建查询: select  TABLE_SCHEMA as '数据库',TABLE

快速生成数据库字典

SELECT TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END , TableDesc=ISNULL(CASE WHEN C.column_id=1 THEN PTB.[value] END,N''), Column_id=C.column_id, ColumnName=C.name , PrimaryKey=ISNULL(IDX.PrimaryKey,N''), [IDENTITY]=CASE WHEN C.is_identi

SQL Server2005+、MySQL、Oracle 数据库字典生成工具

之前找的数据库字典生成工具基本上都依赖于 Office Com 组件,在不安装 Office的情况下无法使用.怒,于是自己用C# 写了一个. 特征如下:    一.支持的数据库 MS SQL Server 2005+.My Sql.Oracle    二.支持的文档类型 Html.CHM.Docx    三.无需安装Office即可生成 Docx 格式的Word文件    四.基于 .net framework 3.5 框架,电脑上需要安装 .net framework 3.5.