проблема cfquery со сложными операторами обновления - PullRequest
1 голос
/ 23 декабря 2009

Я пытаюсь запустить запрос на обновление, используя 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?

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 декабря 2009

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

1 голос
/ 23 декабря 2009

Вы пытались обернуть свое обновление в 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> 
0 голосов
/ 23 декабря 2009

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

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

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

Примечание: Если ваши значения String являются параметрами от пользователя, вы должны обязательно использовать cfqueryparam для защиты от внедрения SQL.

...