У меня есть форма поиска, в которой пользователь выбирает некоторые критерии, прежде чем отправить запрос на сервер. Это включает в себя критерии поиска, которые можно искать по Name
, Number
или Show All
. В нашей существующей (старой системе) предыдущие программисты использовали что-то вроде этого:
<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>
Как вы видите, они используют оператор switch
для оценки аргумента filter by
и на основе этого выполняют поиск запроса. Я думал, что решение, которое будет включать только SQL, будет лучше с точки зрения обслуживания и эффективности. Вот пример:
<cfquery name="qryFindRecord" datasource="#dsn#">
DECLARE @FilterBy INT = <cfqueryparam value="#trim(arguments.frm_filterby)#" cfsqltype="cf_sql_integer" />;
SELECT RecID, Number, Name
FROM Dictionary
WHERE
(@FilterBy = 1 AND Name LIKE <cfqueryparam value="%#trim(arguments.frm_search)#%" cfsqltype="cf_sql_varchar" maxlength="50" />)
OR
(@FilterBy = 2 AND Number = <cfqueryparam value="#trim(arguments.frm_search)#" cfsqltype="cf_sql_char" maxlength="2" />)
ORDER BY Name
</cfquery>
Первый вариант (старый способ, который используется в текущей системе) кажется неэффективным, как с SQL, но я не на 100%, так как у меня нет глубоких знаний о SQL. Вторая причина - WITH (NOLOCK)
, старшие программисты сказали мне, что мы должны использовать это в каждом запросе SELECT в системе. Больше читать и проводить исследования кажется очень плохой привычкой, и ее не следует использовать. Я создаю новую систему, и все, что я ищу, - это хорошая практика для таких ситуаций, которая не приведет к неэффективной системе и жесткому коду для обслуживания. Если у кого-то есть опыт с подобными проблемами, пожалуйста, сообщите мне, как вы справляетесь с этим. Я не уверен, какой подход выбрать и какова наилучшая практика в наши дни.
.. WITH (NOLOCK), I been told by senior programmers that we should use that on every SELECT query in the system.
Reading more and doing research seems that is a very bad habit and should not be used.
›› Вы более правы, чем они. Скорее всего, они используют старую информацию, ноNOLOCK
, вероятно, на самом деле не делает того, что, по их мнению, делает. Кроме того, это просто маскирует другие проблемы. - person Shawn   schedule 10.08.2018