作为一名开发人员,主要编写c#我在编写c#代码时采用了一些良好的实践。当我有时编写存储过程时,我无法将这些实践应用于存储过程代码。构建存储过程的最佳实践
有几次我继承了噩梦存储过程代码,前三到四层存储过程设置了一些临时表并且大多互相调用。没有真正的工作完成,只有几行代码。然后最后有一个叫做“最终”的存储过程,这是一个3000-5000行SQL代码的巨大怪物。这段代码通常有很多代码的味道,如代码复制,错综复杂的控制流(又称意大利面条),以及一种方法,它们将相互堆叠的东西叠加在一起,没有明确的分离,其中一部分工作开始并结束(甚至没有评论作为除数)。
我也注意到使用了从中间临时表中选择的out注释选择语句。为了调试目的,选择可以重新打开,但是在任何调用代码期望返回结果集的特定顺序之前需要将选择移除。
显然我的同事队友也分享我缺乏良好的SQL编写实践。
所以......(这里是真正的问题)......编写模块化可维护存储过程的最佳实践是什么?
欢迎使用自制的练习和参考书籍/博客。方法以及帮助完成特定任务的工具。
让我们总结一下,我还没有发现好的做法
一些地区- 模块化和封装(存储过程通过临时表真的要走的路?通信)
- 在C#中我用的组件,类以及用访问修饰符修饰的方法来完成这一点。
- 调试/测试(不是修改调试的目标更好?)
- 调试工具?
- 调试跟踪?
- 测试夹具?
- 使用代码的代码
- 在C#我重构的结构,打破了更小的方法,做各仅有一个逻辑任务强调的代码/逻辑/数据/控制流。
- 代码重复
主要是我遇到的SQL Server作为DBMS但DBMS无关的答案或答案指出其他DBMS的功能:ES在上述情况下,这种帮助也欢迎。
为了给出一些背景知识:我遇到的大多数大型存储过程都是在报表场景中,其中的基础只是从大型表中创建一些汇总值。但是一路上你需要排除某些异常表中出现的一些值,在一些尚未完成的东西表中添加一些值,与去年相比(你能想象处理产品变更部门的丑陋代码几年之间?)等
由于这些原因以及无法在SCM中使用存储过程,我已经避免了所有这些,除了最必要和最明显的用途(触发器等)。我们将业务逻辑保留在业务层(.NET)中,并将数据库用于这一数据库。 – gahooa
理想情况下,存储过程不应调用其他存储过程。这是BL层的目的。不幸的是,如果你已经拥有一个充满嵌套SP调用的数据库,那么这种情绪并没有真正的帮助。您是否在寻求如何使当前模型更易维护的建议,或者有关如何重构系统以更好地遵循最佳实践的建议? –
@gahooa我也尽可能在.NET中放置了一部分(部分原因是因为那是我的家庭舞台),但在某些情况下,例如继承大型代码库时,或者当您拥有大量数据时,您或多或少都会被卡住程序。 –