CFQUERY问题具有复杂的更新语句
我试图用更新查询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的查询?
谢谢
你尝试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>
你确定你的subselect语句返回1行。这取决于您正在运行的RDMS,但我非常确定并非所有数据库都支持此功能。我试着直接在数据库上运行查询,看它是否正确运行。
您可能能够强制SQL通过将限制1您的查询的末尾,或者如果你的数据库不支持在聚合包装字段1只返回1行。
SELECT MAX(field1) FROM table2 WHERE field3 = 'Some Value'
注意:如果您的字符串值是来自用户的参数,则应确保使用cfqueryparam来防止SQL注入。
如果您可以尝试使用cfqueryparam作为您的值,并且您不必使用PreserveSingleQuotes。它也可以防止SQL注入。
+1。 CF会自动转义引号来缓解sql注入风险。 PreserveSingleQuotes()解除了这种保护,并可以将数据库暴露给sql注入。除非确实需要它,否则不要使用PreserveSingleQuotes(),并且您了解风险。另外,通过使用cfqueryparam,您可以从绑定变量中获得一些性能优势。 – Leigh 2009-12-23 17:01:41
是..它曾与PreserveSingleQuotes,感谢 – CFUser 2009-12-23 05:22:09
我同意jarofclay,现在,它的工作原理,下一步应该将其转换为使用cfqueryparam – kevink 2009-12-23 12:55:02