65.9K
CodeProject 正在变化。 阅读更多。
Home

SqlDoc:记录你的 SQL Server 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (35投票s)

2004年9月6日

CPOL

2分钟阅读

viewsIcon

260700

downloadIcon

5739

一个小型的命令行实用程序,帮助您记录 SQL Server/MSDE 数据库

Sample Image - sqldoc.gif

引言

本文介绍了一个小型命令行实用程序,帮助您记录 SQL Server/MSDE 数据库。

背景

在 SQL Server 中,表、字段、关系等的每个属性都存储在几个系统表中。 您可以查询这些表以提取有关数据库的信息。 SQL Server 提供了一种简化对这些系统表查询的机制:信息模式(Information Schema)。

尝试在任何数据库中运行命令 "SELECT * FROM INFORMATION_SCHEMA.columns"。 将返回数据库中每个表中每个列的列表。

我编写了这个实用程序来自动记录我的数据库,提取表名、列名、字段类型、长度和可空列,并生成一个包含该信息的 HTML 文件。 您可以调整查询以提取您需要的任何其他信息。

有一条特殊信息无法通过信息模式获得:列的描述字段。 我发现它在设计表时非常有用,可以澄清列的目的。 要提取该描述,您必须绕过信息模式并直接查询系统表。

工作原理

此应用程序的内部工作原理非常简单。 它获取特殊查询的结果,并编写一个 XML 文件,该文件与 XSLT 文件结合使用以生成最终的 HTML 文件。

Using the Code

您可以通过输入以下内容快速测试该实用程序,提取有关 Northwind 数据库的信息:

SqlDoc.exe -E -d northwind

这将生成文件 output.html

我试图模仿 OSQL 命令开关。 可用的开关是

  • -E - 使用集成安全性连接到 SQL Server
  • -S server_name - 连接到特定的服务器
  • -U user_id - 使用用户名连接
  • -P password - 不言自明
  • -o outputFileName - 不言自明

源代码非常容易理解,并且具有自描述性。

请注意,正如之前评论的那样,为了提取列的描述字段,代码绕过了提取列信息的标准方法。 这意味着在未来版本的 SQL Server 中,查询可能会失败。 如果您发现“描述字段”无用,您可以注释/取消注释这些行以使用您想要的方法。

// most compatible way to retrieve column info but lacks 
// description field
//private const string SQL_GETFIELDS = "SELECT TABLE_NAME, " +
//    "COLUMN_NAME, COLUMN_DEFAULT, DATA_TYPE, " +
//    "CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE " +
//    "FROM INFORMATION_SCHEMA.Columns " + 
//    "WHERE TABLE_NAME IN (" + SQL_GETTABLES + ")";

// this one gets columns info + the description field
private const string SQL_GETFIELDS = 
    "SELECT Sysobjects.name AS TABLE_NAME, " +
    "syscolumns.Id, syscolumns.name AS COLUMN_NAME, " + 
    "systypes.name AS DATA_TYPE, syscolumns.length" + 
    " as CHARACTER_MAXIMUM_LENGTH, " +
    "sysproperties.[value] AS COLUMN_DESCRIPTION,  " +
    "syscomments.text as COLUMN_DEFAULT, " +
    "syscolumns.isnullable as IS_NULLABLE " +
    "FROM syscolumns INNER JOIN systypes " +
    "ON syscolumns.xtype = systypes.xtype " +
    "LEFT JOIN sysobjects ON syscolumns.id = sysobjects.id " + 
    "LEFT OUTER JOIN sysproperties ON " +
    "(sysproperties.smallid = syscolumns.colid" + 
    " AND sysproperties.id = syscolumns.id) " +
    "LEFT OUTER JOIN syscomments ON syscolumns.cdefault = syscomments.id " +
    "WHERE syscolumns.id IN " + 
    "(SELECT id FROM SYSOBJECTS WHERE xtype = 'U') " + 
    "AND (systypes.name <> 'sysname')" +
    "ORDER BY syscolumns.colid";

关注点

抛开这个应用程序的目的不谈,我对学习 XSLT 转换很感兴趣。 演示项目包含一个测试 XSLT 文件。 您可以编辑此文件以改进输出格式。

改进

SQL Server 存储了大量有关每个数据库、关系、关键列、视图、存储过程等的信息。 因此,完全记录数据库是最好的方法。

© . All rights reserved.