Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过存储过程重用SQL Server代码-好的做法还是坏的做法?_Sql_Sql Server_Database_Database Design - Fatal编程技术网

通过存储过程重用SQL Server代码-好的做法还是坏的做法?

通过存储过程重用SQL Server代码-好的做法还是坏的做法?,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,我目前正在考虑基于现有数据集的报表应用程序的设计选项 考虑到许多报告需要使用相同的基本数据集(已编辑),代码重用有几个明显的机会 临时任务是创建一些可以在整个系统中重用的基本存储过程,但是,我在6个月前签订的合同向我展示了这种做法的缺点——多层大型存储过程调用返回的数据子集,这使得我很难了解发生了什么,调试和测试 我现在的观点是,代码重用不一定能提高数据库设计中的可维护性 我想从一位比我更有经验的SQL Server开发人员那里了解一下这一点 提前感谢。免责声明:这不是一篇“不要使用存储过程-想

我目前正在考虑基于现有数据集的报表应用程序的设计选项

考虑到许多报告需要使用相同的基本数据集(已编辑),代码重用有几个明显的机会

临时任务是创建一些可以在整个系统中重用的基本存储过程,但是,我在6个月前签订的合同向我展示了这种做法的缺点——多层大型存储过程调用返回的数据子集,这使得我很难了解发生了什么,调试和测试


我现在的观点是,代码重用不一定能提高数据库设计中的可维护性

我想从一位比我更有经验的SQL Server开发人员那里了解一下这一点

提前感谢。

免责声明:这不是一篇“不要使用存储过程-想想孩子们!”的帖子,我的目的不是点燃一场火焰之战。我只是建议代码重用比其他更容易,并且可能更适合某些情况和平台

作为一个概念,代码重用通常会改进代码库。您保留了一些东西,并开始形成一个通用功能层,以同样的方式解决常见问题

然而,就像任何事情一样,一个人可能会犯错(权力带来责任等等)

在大多数现代编程语言中,通过编写函数甚至创建可以反复使用的整个框架来重用代码是相对简单的。然而,在T-SQL中,这很棘手,因为您的选项较少。存储过程可以做到这一点,但您已经看到它们是多么的笨拙

我个人的偏好是将业务逻辑排除在数据库之外。这意味着我不使用视图、UDF、存储过程等(除非在性能分析之后,我们认为我们可以使用这些技术加快速度),而是将其保留在应用程序代码中。这通常会引起“业务逻辑层”的想法,但有各种各样的味道,所以它可能用词不当。不过,它肯定不是直接在UI按钮单击处理程序等后面编写的代码

我的目标是将数据库限制为存储和检索数据,因为这是他们真正擅长的。我们都知道T-SQL作为一种语言有多么笨拙和过时(想想异常处理、部署、游标等)。如果您的应用程序被写入数据库本身,那么不依赖数据库是完全不可能的,而且您也不能扩展应用程序,因为数据库就是应用程序。如果您在应用程序代码中具有该业务逻辑,则可以更轻松地进行扩展


在这种情况下,“业务逻辑”是用于生成报告的查询和转换,在考虑其他选项之前,我将研究如何在报告工具/代码中重用代码。

代码重用的主要目的,IMO,就是将单片程序分解成更容易理解和维护的部分。分工不能是特殊的——一个人对秩序的个人古怪想法。构建助手函数库的艺术在很大程度上是一门社会艺术——您必须定义一个方法一致的可理解API。你不希望跟踪你的程序员在缺席的情况下诅咒你。您希望他们感谢您的设计的清晰性和实用性


@尼尔·巴恩韦尔:我认为在数据库中建立业务规则没有问题。触发器和存储的进程可以执行这个角色,如果不比中间层或客户端代码更好的话。当然,您必须有精通数据库编程语言、T-SQL或PL/SQL或其他任何语言的程序员。

TSQL中的代码重用需要根据具体情况进行。您需要养成习惯,检查您编写的所有查询的执行计划,以确定该计划是否合理

根据视图的定义,将视图连接到视图可以很好地工作,也可能导致效率低下


内联表值函数是重用代码的一种非常好的方法。它们避免了视图中可能出现的谓词推送问题,并且随着查询优化程序的扩展,它们允许您对结果应用过滤器,这比尝试对多语句TVF或存储过程resultset执行同样的操作更有效

“我现在的观点是,代码重用不一定能提高数据库设计中的可维护性。“这是主要问题,正文的其余部分是上下文。存储过程标题中的具体限制有什么原因吗?”?这些并不是代码重用的唯一机制。我知道有几种方法可以实现代码重用。例如,我有一个存储过程,它返回显示客户帐户历史的特定数据集(报告1)。我需要的新数据集(报告2)非常相似,但只需要这些数据的一个子集。使用原始报表提取所有数据效率低下,因为我不需要所有结果集。此外,如果原始报告被更改,它可能会破坏我的新报告。最重要的是,如果一个新开发人员想要理解报表2,他还必须理解报表1。如果将多个存储过程/视图/函数组合在一起以创建新的数据集,这将变得不易管理我同意你所说的一切。听起来您更喜欢内联sql而不是存储过程?在我的情况下,性能将受到太多的影响。此外,我特别同意将业务逻辑排除在数据库之外——但是这里的权衡是,业务逻辑层中的转换效率不高,可能需要多次往返数据库。这意味着业务逻辑不可避免地会出现在我的应用程序的数据库中。我还认为数据库是gr