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

StackOverflow https://stackoverflow.com/questions/1950486

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Спасибо

Это было полезно?

Решение

Вы пробовали обернуть свое обновление в 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> 

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top