使用OR或vs ColdFusion筛选SQL查询Where子句?
我有一个搜索表单,用户在向服务器提交请求之前选择一些条件。这涉及到可以通过使用OR或vs ColdFusion筛选SQL查询Where子句?,sql,sql-server-2008,coldfusion,where-clause,coldfusion-2016,Sql,Sql Server 2008,Coldfusion,Where Clause,Coldfusion 2016,我有一个搜索表单,用户在向服务器提交请求之前选择一些条件。这涉及到可以通过名称、编号或全部显示进行搜索的搜索条件。在我们现有的(旧系统)中,以前的程序员使用了如下内容: <cfquery name="qryFindRecord" datasource="#dsn#"> SELECT RecID, Number, Name FROM Dictionary WITH (NOLOCK) WHERE 1 = 1 AND &
名称
、编号
或全部显示
进行搜索的搜索条件。在我们现有的(旧系统)中,以前的程序员使用了如下内容:
<cfquery name="qryFindRecord" datasource="#dsn#">
SELECT RecID, Number, Name
FROM Dictionary WITH (NOLOCK)
WHERE 1 = 1
AND
<cfswitch expression="#arguments.frm_filterby#">
<cfcase value="1"><!--- Name --->
Name LIKE <cfqueryparam value="%#trim(arguments.frm_search)#%" cfsqltype="cf_sql_varchar" maxlength="50" />
</cfcase>
<cfcase value="2"><!--- Number --->
Number = <cfqueryparam value="#trim(arguments.frm_search)#" cfsqltype="cf_sql_char" maxlength="2" />
</cfcase>
<cfdefaultcase><!--- Show All --->
1 = 1
</cfdefaultcase>
</cfswitch>
ORDER BY Name
</cfquery>
第一个选项(当前系统中使用的旧方法)似乎没有SQL那么有效,但我不是100%,因为我对SQL没有深入的了解。第二个原因是使用(NOLOCK),高级程序员告诉我,我们应该在系统中的每个SELECT查询中使用它。多读书和做研究似乎是一个非常坏的习惯,不应该使用。我正在建立一个新的系统,我所寻找的是这种情况下的良好实践,不会导致系统效率低下和维护的硬代码。如果有人有类似问题的经验,请让我知道你是如何处理的。我不确定现在该采取哪种方法,最好的做法是什么 我熟悉MS SQL Server,所以我很熟悉
与(NOLOCK)
应根据具体情况决定。当正确性不如性能重要时,这是有意义的。这在很大程度上取决于数据库中的操作类型
关于您的cfquery
,我认为您的重构很好。任何看起来更接近存储过程的东西都更有可能被RDBMS参数化,这意味着高效的执行计划缓存。如果可以,我会将其转换为存储过程
由于这是一个简单的查询,请考虑将条件逻辑提升为CaldFIX,并有两个查询或存储过程。 SQL生成的动态性越低,暴露漏洞的风险就越小。我还发现,在多年调试使用大量动态SQL的ColdFusion应用程序之后,每当我看到
1=1
。。。这通常是您应该开始重构的标志
例如,要通过提升查询的条件逻辑来进一步简化查询,您可以说:
<cfif arguments.frm_filterby eq 1>
<cfquery name="qryFindRecord" datasource="#dsn#">
SELECT RecID, Number, Name
FROM Dictionary
WHERE Name LIKE <cfqueryparam value="%#trim(arguments.frm_search)#%" cfsqltype="cf_sql_varchar" maxlength="50"/>
ORDER BY Name
</cfquery>
<cfelseif arguments.frm_filterby eq 2>
<cfquery name="qryFindRecord" datasource="#dsn#">
SELECT RecID, Number, Name
FROM Dictionary
WHERE Number = <cfqueryparam value="#trim(arguments.frm_search)#" cfsqltype="cf_sql_char" maxlength="2"/>
ORDER BY Name
</cfquery>
<cfelse>
<!--- Invalid request? --->
</cfif>
选择RecID、编号、名称
从字典
你的名字在哪里
点名
选择RecID、编号、名称
从字典
其中数字=
点名
这里真正的区别在于您是主要阅读ColdFusion还是SQL
或者是一个版本,它隐藏了更多的DB内部,其中包含:
我熟悉MS SQL Server,所以YMMV
与(NOLOCK)
应根据具体情况决定。当正确性不如性能重要时,这是有意义的。这在很大程度上取决于数据库中的操作类型
关于您的cfquery
,我认为您的重构很好。任何看起来更接近存储过程的东西都更有可能被RDBMS参数化,这意味着高效的执行计划缓存。如果可以,我会将其转换为存储过程
由于这是一个简单的查询,请考虑将条件逻辑提升为CaldFIX,并有两个查询或存储过程。 SQL生成的动态性越低,暴露漏洞的风险就越小。我还发现,在多年调试使用大量动态SQL的ColdFusion应用程序之后,每当我看到
1=1
。。。这通常是您应该开始重构的标志
例如,要通过提升查询的条件逻辑来进一步简化查询,您可以说:
<cfif arguments.frm_filterby eq 1>
<cfquery name="qryFindRecord" datasource="#dsn#">
SELECT RecID, Number, Name
FROM Dictionary
WHERE Name LIKE <cfqueryparam value="%#trim(arguments.frm_search)#%" cfsqltype="cf_sql_varchar" maxlength="50"/>
ORDER BY Name
</cfquery>
<cfelseif arguments.frm_filterby eq 2>
<cfquery name="qryFindRecord" datasource="#dsn#">
SELECT RecID, Number, Name
FROM Dictionary
WHERE Number = <cfqueryparam value="#trim(arguments.frm_search)#" cfsqltype="cf_sql_char" maxlength="2"/>
ORDER BY Name
</cfquery>
<cfelse>
<!--- Invalid request? --->
</cfif>
选择RecID、编号、名称
从字典
你的名字在哪里
点名
选择RecID、编号、名称
从字典
其中数字=
点名
这里真正的区别在于您是主要阅读ColdFusion还是SQL
或者是一个版本,它隐藏了更多的DB内部,其中包含:
您指的是ColdFusion调用存储过程的示例,还是调用存储过程本身的示例?一般来说,什么是一个好的选择或方法。此外,如果这种情况下使用ColdFusion是一种解决方案,那么还需要举例说明如何使用ColdFusion调用存储过程。“最佳”实现取决于很多因素:查询的复杂性、谁在维护查询(web或SQL开发人员)、查询是否足够复杂,从而保证了存储过程(临时表,调用其他存储过程),无论您是否正在执行事务……我添加了一个调用存储过程的示例。@Shawn关于SQL存储过程呢?我看到了各种建议的解决方案,但每种解决方案都有一些缺点。存储过程是搜索数据库表的最佳方法吗?我是否应该使用一个带有过滤器的存储过程如果我们有多个存储过程,se或者更好?另外,只是一个代码检查注释,我要补充的是,您正在为Name
传递一个cf\u sql\u varchar
,为Number
传递一个cf\u sql\u char
,因此请确保这些cf数据类型与sql数据类型匹配,这样您就不会在幕后得到隐式的协同数据转换。我不知道Number
中的数据类型是什么,但传入char
类型似乎不正确。名为Number
且似乎限制为2个字符的内容可能是整数。但如果数据库列实际上是char(2)
,请坚持这一点。您是指ColdFusion调用存储过程的示例,还是指存储过程本身?一般来说,什么是一个好的选择或方法。此外,如果这是本例的解决方案,还需要关于如何使用ColdFusion调用存储过程的示例。“最佳”实现取决于很多事情:查询的复杂性、谁在维护
<cfif arguments.frm_filterby eq 1>
<cfstoredproc procedure="DictionaryByName" datasource="#dsn#">
<cfprocparam value="%#trim(arguments.frm_search)#%" cfsqltype="cf_sql_varchar" maxlength="50"/>
<cfprocresult name="qryFindRecord"/>
</cfstoredproc>
<cfelseif arguments.frm_filterby eq 2>
<cfstoredproc procedure="DictionaryByNumber" datasource="#dsn#">
<cfprocparam value="#trim(arguments.frm_search)#" cfsqltype="cf_sql_char" maxlength="2"/>
<cfprocresult name="qryFindRecord"/>
</cfstoredproc>
<cfelse>
<!--- Invalid request? --->
</cfif>