使用字符串生成器或存储过程进行单行选择

Posted

技术标签:

【中文标题】使用字符串生成器或存储过程进行单行选择【英文标题】:Single line select using string builder or Stored Procedure 【发布时间】:2012-11-12 11:52:30 【问题描述】:

我的应用程序中有很多单行选择查询,其中包含跨越 5-6 个表的多个连接。这些查询是基于许多条件生成的,这些条件基于来自表单等的输入,使用字符串生成器。然而,我的团队负责人恰好是一名 sql 开发人员,他要求我将这些单行查询转换为存储过程。

将单行选择查询转换为后端并作为 SP 执行所有 if 和 else 有什么好处吗?

【问题讨论】:

您“基于许多条件”生成查询。在数据库中(在存储过程中)测试这些条件有多难? @HansKesting 好吧,这很安静。但这是否会在跨越 5-6 个表的长选择语句的情况下提高性能 【参考方案1】:

将所有 sql 部分都包含在存储过程中的一个优点是,您可以将查询保存在数据库的一个位置,这样就可以更容易地更改或修改,而无需在应用程序层或前端层进行大量更改。

如果 SQL 存储在数据库过程中,DBA 或 SQL 开发人员可以微调它。您可以将所有函数/存储过程保存在一个包中,这在性能和组织对象方面会更好(类似于在 Java 中创建包的方式)。当然,在包中,您可以限制对其对象的直接访问。

这更多是团队或部门的政策,无论是在前端还是在数据库本身中保留 sql 部分,当然就像@Gimby 提到的那样,很多人可能有不同的看法。

更新 1

如果您有一个返回某些内容的 select 语句,请使用函数,如果您有 INSERT/UPDATE/DELETE 或类似的东西,例如发送电子邮件或其他业务规则,则使用过程并通过传递参数从前端调用这些。

【讨论】:

对于多个 sql 语句来说没问题。但是如果它的单行查询真的有意义吗?当我必须检查用户是否在表单中输入值 A 或 B 并在查询中相应地加入时,请使用 Splly。 @AkhilKNambiar 恕我直言,使用函数/过程并从前端调用。也许将来有人想修改,他们可以在函数或过程中进行修改,而无需接触应用程序代码。【参考方案2】:

恐怕这个问题会根据许多不同的个人观点导致许多不同的答案。

无论如何,在我看来,您在这里谈论的业务逻辑属于应用程序层。但我认识一大群完全不同意我的 Oracle 开发人员。

【讨论】:

【参考方案3】:

如果您在 java 中使用 PreparedStatement,那么两者之间的性能没有太大差异 java查询和存储过程。 (如果你在java中使用Statement,那么你有问题)。

但是存储过程是组织和重用你的 sql 代码的好方法。您可以将它们分组到包中,无需 java 编译即可更改它们,并且您的 DBA 或 SQL 专家可以调整它们。

【讨论】:

以上是关于使用字符串生成器或存储过程进行单行选择的主要内容,如果未能解决你的问题,请参考以下文章

存储过程返回所有代码,但手动触发时返回单行

SQL 语句调用这个存储过程,生成顺序编码

[终章]进阶20-流程控制结构--if/case/while结构 - 三个while的存储过程案例(批量生成表单数据) - 随机长度的随机字符串的存储过程案例

使用实体框架核心生成和访问存储过程

如何使用 SqlCommand::Execute(或替代方法)从同一存储过程中“选择 *”和“选择计数(*)”?

如何将参数传递给 Microsoft Sync 2.1 生成的存储过程