проблема cfquery со сложными операторами обновления

Я пытаюсь запустить запрос на обновление, используя cfquery, как показано ниже.

   <cfquery name = "UpdateRecord"   
            dataSource = #DATASOURCE#   
            username = #DBUSER#   
            password = #DBPASSWORD# 
            result="updateResult" >  
        update table1 
set field1=( select field1 from table2 where field3='Some Value')
 where field4='someothervalue'
     </cfquery> 
    <cfdump var="#UpdateResult#">

Но, когда я запускаю эту страницу, страница не загружается, в строке состояния я вижу ее загрузку в течение длительного времени.

Но если я использую любой простой запрос на обновление, например

update table1 set field1='abc' where field4='someothervalue'

тогда работает нормально

Может ли кто-нибудь понять, как я могу выполнять запросы, подобные приведенным выше, с помощью cfquery?

Спасибо


person CFUser    schedule 23.12.2009    source источник


Ответы (3)


Вы пытались обернуть свое обновление в PreserveSingleQuotes?

 <cfquery name = "UpdateRecord"   
        dataSource = #DATASOURCE#   
        username = #DBUSER#   
        password = #DBPASSWORD# 
        result="updateResult" >  
   #PreserveSingleQuotes(update table1 set field1=( select field1 from
   table2 where Field3='Some Value') where field4='someothervalue')#
 </cfquery> 
person kevink    schedule 23.12.2009
comment
Я согласен с jarofclay, теперь, когда он работает, следующим шагом должно быть преобразование его для использования cfqueryparam - person kevink; 23.12.2009

Если вы можете попробовать использовать cfqueryparam для своих значений, вам не придется использовать PreserveSingleQuotes. Он также защищает от SQL-инъекций.

person jarofclay    schedule 23.12.2009
comment
+1 . CF автоматически экранирует кавычки, чтобы снизить риски SQL-инъекций. PreserveSingleQuotes() снимает эту защиту и может подвергать базы данных внедрению sql. Не используйте PreserveSingleQuotes(), если это действительно не нужно и вы понимаете риски. Кроме того, с помощью cfqueryparam вы получаете некоторые преимущества в производительности за счет связывания переменных. - person Leigh; 23.12.2009

Вы уверены, что ваш оператор подзапроса возвращает 1 строку. Это зависит от того, какую RDMS вы используете, но я почти уверен, что не все базы данных поддерживают эту функцию. Я бы попробовал сначала запустить запрос непосредственно в вашей базе данных, чтобы убедиться, что он работает правильно.

Возможно, вы сможете заставить sql возвращать только 1 строку, поставив ограничение 1 в конце вашего запроса, или если ваша база данных не поддерживает перенос field1 в агрегат.

SELECT MAX(field1) FROM table2 WHERE field3 = 'Some Value'

Примечание. Если ваши строковые значения являются параметрами пользователя, обязательно используйте cfqueryparam для защиты от SQL-инъекций.

person buckley    schedule 23.12.2009
comment
Да, я пробовал то же самое на Directly DB, там все работало нормально, но не работало, если я использовал cfquery. и мой оператор select дает только один вывод. Можем ли мы использовать скобки '(',')' в cfquery? - person CFUser; 23.12.2009
comment
Где вы используете '(',')' в опубликованном вами запросе? Нет ничего плохого в использовании скобок. Вероятно, это проблема с вашими одинарными кавычками. Когда вы не используете cfqueryparam, CF предпримет несколько шагов, чтобы защитить вас от самого себя ;) См. мой ответ @jarofclay. - person Leigh; 23.12.2009