【问题标题】:Dynamic SQL query creation动态 SQL 查询创建
【发布时间】:2014-02-12 07:44:17
【问题描述】:

1) 我正在制作一个显示汇总表的应用程序。单击每个摘要列时,我可以按升序或降序方式进行排序。例如有 5 列

2) 因此,在正常情况下,我将创建至少 5 个单独的 sql 查询来提供此功能。这可以创建为准备好的语句。

3) 但是创建一个动态的单个 sql 代码是否是一个好习惯,它可以考虑所有 where 条件和所有 order by,就像我在下面所做的那样?它将如何影响数据库性能?既然现在我不能写任何东西作为准备好的语句,我的执行会很慢吗?

请推荐 谢谢

 CREATE DEFINER=`root`@`localhost` PROCEDURE `lSummary`(in fixedConditionList VARCHAR(1000),in OptionalConditionListForBackEnd VARCHAR(1000),in orderByColumnList VARCHAR(1000),in optionalJoinStatement VARCHAR(1000),in startLimit int( 10),在 OptionalFilterListWithAnd VARCHAR(1000),在 OptionalFilterListWithOr VARCHAR(1000),在 selectColumnList VARCHAR(10000),在 EndLimit int(10))
开始
    DECLARE SQLStatement varchar(5000);

    SET @SQLStatement = CONCAT("select l.lCaseId,concat('Staf') as canWrite,concat('Staf') as canShare,DATE_FORMAT(c.nextCourtDate,'%d-%m-%Y') as nextCourtDate, TIME_FORMAT(c.nextTime,'%h:%i %p') as nextTime,totalNumberOfSSteps,totalNumberOfSteps, ",selectColumnList," from 诉讼 l left join(selectrelatedToId,relatedToPrefix,count(*) as totalNumberOfSteps from flowsubmilestoneinuse group by relatedToId )作为 l.lCaseId=wt.relatedToId 上的 wt 和 l.lCasePrefix=wt.relatedToPrefix 左连接(从 flowsubmilestoneinuse 中选择 relatedToId,relatedToPrefix,count(*) 作为 totalNumberOfSSteps,其中里程碑ReachedById 不是 null group by relatedToId )作为 l.lCaseId 上的 wc =wc.relatedToId and l.lCasePrefix=wc.relatedToPrefix left join detail c on c.lCaseId= l.lCaseId ",optionalJoinStatement," where (",fixedConditionList,") AND (",OptionalConditionListForBackEnd,") AND (",OptionalFilterListWithAnd ,") AND (",OptionalFilterListWithOr,") order by ",orderByColumnList," Limit ",startLimit,EndLimit);


    执行STMT;

结尾

【问题讨论】:

  • 当然,准备好的语句可以在运行时接受动态参数。这不是问题。
  • 嗨,如果可能的话,您能否指导我参考一些教程。谢谢

标签: sql database


【解决方案1】:

关于数据库性能:通常 - 是的,动态查询会影响性能。 在底层,SQL Server 引擎创建查询执行计划,甚至是动态查询。在这种情况下,您必须尝试评估性能。此外,您还可以分析执行计划并进行改进。

我可以看出您对 T-SQL 的使用非常好,但我的印象是您为此使用了错误的工具。当然,SQL Server 可以处理这种类型的任务,但我的建议是:让客户端处理排序,同时使用 SQL Server 作为它的主要角色 - 获取数据。

请考虑一下:一旦您将一组数据存储在内存中,进行内存排序比向服务器发送新请求要快得多。对吧?

当然,这取决于您使用的客户端技术。例如,如果您使用基于 Web 的客户端,则有很多基于 jQuery 的产品可以为您完成(例如,参见 www.jtable.org)。此外,对于 .NET,还有许多易于使用且针对排序进行了优化的表格控件。

【讨论】:

  • 谢谢凯南。我会考虑你的建议
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多