问答中心分类: SQL与代码相比,将SQL保留在存储过程中的利弊是什么
0
Guy 提问 38分钟 前

关闭.这个问题是基于意见。它当前不接受答案。

关闭8年前.

已锁定。这个问题及其答案是已锁定因为这个问题离题了,但有历史意义。它目前不接受新的答案或互动。

将SQL保留在C源代码或存储过程中有哪些优点/缺点?我一直在和一个朋友讨论这个问题,他正在做一个开源项目(C#ASP.NET论坛)。目前,大多数数据库访问是通过在C#中构建SQL内联并调用SQL Server DB来完成的。所以我想确定,对于这个特定的项目,哪一个是最好的。
到目前为止,我已经:
代码内的优点:

  • 易于维护-不需要运行SQL脚本来更新查询
  • 更容易移植到另一个数据库-无需过程到端口

存储过程的优点:

  • Performance
  • 安全
29 Answers
0
Eric Z Beard 回答 38分钟 前

目前,其他几个线程正在讨论这一点。我一贯支持存储过程,尽管有人提出了一些将Linq转换为Sql的好论点。
在代码中嵌入查询将您与数据模型紧密结合。存储过程是契约式编程的一种良好形式,这意味着DBA有权更改过程中的数据模型和代码,只要存储过程的输入和输出所代表的契约得到维护。
如果查询隐藏在代码中,而不是集中在一个易于管理的位置,那么调优生产数据库可能非常困难。
[编辑]这是另一个当前讨论

0
huo73 回答 38分钟 前

在我看来,在这个问题上你不能投赞成票或反对票。这完全取决于应用程序的设计。
我完全反对在三层环境中使用SPs,在这种环境中,前面有一个应用服务器。在这种环境中,应用服务器用于运行业务逻辑。如果您另外使用SPs,您将开始在整个系统中分发业务逻辑的实现,那么谁负责什么将变得非常不明确。最终,您将得到一个应用程序服务器,它基本上只做以下事情:

(Pseudocode)

Function createOrder(Order yourOrder) 
Begin
  Call SP_createOrder(yourOrder)
End

最后,你的中间层运行在这个非常酷的4服务器集群上,每个集群都配备了16个CPU,实际上它什么都不做!真是浪费!
如果您有一个直接连接到DB或更多应用程序的胖gui客户端,情况就不同了。在这种情况下,SP可以作为某种伪中间层,将应用程序与数据模型解耦,并提供可控访问。

0
Rob Allen 回答 38分钟 前

代码内的优点:

  • 易于维护-不需要运行SQL脚本来更新查询
  • 更容易移植到另一个数据库-无需过程到端口

事实上,我认为你的观点是相反的。恕我直言,代码中的SQL很难维护,因为:

  • 你最终会在相关的代码块中重复自己
  • 许多IDE都不支持SQL作为一种语言,因此只有一系列未经错误检查的字符串为您执行任务
  • 数据类型、表名或约束的更改比将整个数据库换成新数据库要普遍得多
  • 随着查询的复杂性增加,难度也会增加
  • 测试内联查询需要构建项目

将存储过程视为从数据库对象调用的方法-它们更易于重用,只有一个地方可以编辑,如果您确实更改了数据库提供程序,则更改发生在存储过程中,而不是代码中。
也就是说,正如斯图在我之前所说的那样,存储过程的性能增益是最小的,而且你还不能在存储过程中设置断点。

0
computinglife 回答 38分钟 前

反对的论点
我发现在存储过程中进行大量处理会使您的DB服务器在扩展act时变得不灵活。
然而,与sql server相反,在程序中执行所有这些操作,可以如果您有多个运行代码的服务器,则允许您进行更大的扩展。当然,这不适用于仅执行正常提取或更新的存储过程,而适用于执行更多处理(如在数据集上循环)的存储过程。
赞成的意见

  1. 性能(避免由数据库驱动程序/计划重新创建等进行查询解析)
  2. 数据操作没有嵌入到C/C++/C代码中,这意味着我要查看的低级代码更少。当单独列出时,SQL不那么冗长,更容易查看。
  3. 由于分离,人们能够更容易地查找和重用SQL代码。
  4. 当模式更改时,更容易更改内容-您只需为代码提供相同的输出,它就会正常工作
  5. 更容易移植到其他数据库。
  6. 我可以列出存储过程的个人权限,并控制该级别的访问。
  7. 我可以将数据查询/持久性代码与数据转换代码分离。
  8. 我可以在存储过程中实现可变条件,并且很容易在客户站点进行自定义。
  9. 使用一些自动化工具将模式和语句转换在一起变得更容易,而不是将其嵌入代码中,在代码中查找它们。
  10. 当您将所有数据访问代码都放在一个文件中时,确保数据访问的最佳实践更容易——我可以检查访问非性能表的查询,或者使用更高级别的序列化或代码中的select*’s等的查询。
  11. 当所有内容都列在一个文件中时,更容易找到模式更改/数据操作逻辑更改。
  12. 当SQL上的编辑位于同一位置时,搜索和替换它们变得更加容易,例如,为所有存储过程更改/添加事务隔离语句。
  13. 我和DBA人员发现,当DBA必须查看我的SQL内容时,拥有一个单独的SQL文件更容易/方便。
  14. 最后,您不必担心SQL注入攻击,因为您团队中的一些懒惰成员在使用嵌入式SQL时没有使用参数化查询。
0
Stu 回答 38分钟 前

存储过程的性能优势通常是可以忽略的。
存储过程的更多优点:

  • 防止逆向工程(当然,如果使用加密创建)
  • 更好地集中数据库访问
  • 能够透明地更改数据模型(无需部署新客户端);如果多个程序访问同一数据模型,则特别方便