проблема cfquery со сложными инструкциями обновления
-
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-инъекции.