2

我即将继承一组庞大而复杂的存储过程,它们每月对非常大的数据集进行处理。

我们正在调试它们,以便它们与用 VB6 编写的原始过程相匹配。他们决定在 t-sql 中重新编写它们的原因是因为 vb 过程需要几天时间,而这个新过程需要几个小时。

这一切都很好,但我怎样才能使这些现在大量的 t-sql 代码(1.5k+ 行)甚至远程可读/可维护。

非常欢迎任何使 t-sql 不那么头痛的经验。

4

7 回答 7

4

首先,创建一个包含 .sql 文件的目录并在其中维护它们。将这组 .sql 文件添加到修订控制系统。SVN 运行良好。有一个工具可以将这些加载到您的数据库中,覆盖任何现有的。

有一个测试数据库和基线报告,显示每月处理的输出应该是什么样子。您的测试也应该采用受版本控制的 .sql 文件的形式。

您现在可以随心所欲地重构您的过程,然后运行您的测试以确认正确的功能。

于 2008-09-17T16:12:51.470 回答
2

对于格式化/漂亮的 SQL,我在http://www.sqlinform.com/上取得了成功——您可以试用免费的在线版本,也可以使用桌面版本。

SQLinForm 是所有主要数据库(ORACLE、SQL Server、DB2 / UDB、Sybase、Informix、PostgreSQL、MySQL 等)的自动 SQL 代码格式化程序,具有许多格式化选项。

于 2008-09-17T16:16:53.627 回答
2

一定要从重新格式化代码开始,尤其是缩进。

然后将 SQL 模块化。在它们自己的独立文件中将块提取到更小的、描述性命名的过程和函数中。我发现仅此一项就可以很好地提高我对大型 SQL 文件的理解。

于 2008-09-17T16:31:01.940 回答
2

ApexSQLScript 是一个用于编写整个数据库脚本的出色工具 - 然后您可以将其签入源代码控制并管理更改。

我还发现,始终记录存储过程可以让您使用 sys.sql_modules 中有关源代码的数据提取有关它们的信息 - 您可以使用标签或其他任何东西来帮助记录子系统。

此外,使用模式(甚至多个数据库)——这将真正有助于将您的数据库划分为逻辑单元并指出架构问题。

就大型代码而言,我最近发现 SQL2005 CTE 功能在管理具有大量嵌套查询(甚至不是递归)的代码时非常有用。可以声明和构建 CTE,然后在最终语句中使用,而不是管理一堆嵌套和缩进。这也有助于重构,因为删除冗余的嵌套查询和列似乎要容易得多。

存储过程和 UDF 对于管理大型代码库和消除暗角至关重要。我没有发现视图非常有用,因为它们不可参数化(如果结果集很小,则可以在这些情况下使用 UDF)。

于 2008-09-18T21:48:42.743 回答
1

尽量将 SQL 模块化,并进行一组测试,使您能够在需要时维护、重构和添加特性。我曾经有幸继承了一个总计 5000 行的存储过程,但我仍然对它做噩梦。项目结束后,我打印出存储的过程,以便在此过程中破坏 X 树的笑声。在我们公司的一个每周站立会议上,我将它首尾相连,并延伸到整个建筑物的长度。以此为例说明如何不编写和维护存储过程。

于 2008-09-17T16:38:00.987 回答
0

您可以做的一件事是拥有一个自动化脚本来存储对源代码管理的所有更改,以便您可以查看对过程的更改(使用以前和当前版本的差异)

于 2008-09-17T16:14:45.490 回答
0

它绝对不是免费的,但是为了保持你的 T-SQL 格式一致,Redgate Software 的SQL Prompt非常方便。只要您的 proc 语法正确,几次击键 (Ctrl+K,Y) 就会立即重新格式化它。这些选项使您可以对 SQL 的格式进行大量控制。

于 2008-09-18T21:56:43.037 回答