SqlDoc:记录你的 SQL Server 数据库






4.73/5 (35投票s)
一个小型的命令行实用程序,帮助您记录 SQL Server/MSDE 数据库
引言
本文介绍了一个小型命令行实用程序,帮助您记录 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 存储了大量有关每个数据库、关系、关键列、视图、存储过程等的信息。 因此,完全记录数据库是最好的方法。