起初我以为我遇到了cfqueryparam和mysql的问题。但是,当我更改用静态值替换它时,我得到相同的错误。这让我感到难过,我猜我已经习惯了Microsoft SQL Server。任何帮助将不胜感激。
这是查询,这在mySql查询浏览器中完美运行,但在cfquery中运行时失败:
LOCK TABLE categories WRITE;
SELECT @myRight := rgt FROM categories WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">;
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE categories SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO categories(categoryName, lft, rgt) VALUES(<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">, @myRight, @myRight + 2);
UNLOCK TABLES;
我收到以下错误:
您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'SELECT @myRight:= rgt FROM categories WHERE catid = 5附近使用正确的语法;在第2行更新类别SE'
VENDORERRORCODE:1064 SQL状态:42000
答案 0 :(得分:1)
除非您在MySQL服务器上明确允许它,否则在同一个cfquery中不能有多个sql语句。 MySQL通过defualt拒绝这一点,所以你的每个update和insert语句都必须在他们自己的cfquery标签中。
答案 1 :(得分:1)
CFGears是对的,你不能在一个语句中放置多个查询。
要从cf执行此操作,您需要避开mySQL变量。 (无论如何这都很好,因为如果你坚持使用或多或少的标准SQL,你的应用程序将更容易移植到其他品牌的表服务器。)像这样的东西?如果您正在处理myISAM表,则需要在此处放置锁表并解锁表。如果您正在使用InnoDB,那么在事务中执行它将正常工作。
这样的事情可能有用。
<cfquery name ="getright" datasource="#whatever#">
SELECT rgt
FROM categories
WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">
</cfquery>
<cfquery name="rgt_up_2" datasource="#whatever#">
UPDATE categories
SET rgt = rgt + 2
WHERE rgt >
(SELECT rgt
FROM categories
WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>
<cfquery name="lft_up_2" datasource="#whatever#">
UPDATE categories
SET lft = lft + 2
WHERE lft >
(SELECT rgt
FROM categories
WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>
<cfquery name="insrgt" datasource="#whatever#">
INSERT INTO categories(categoryName, lft, rgt) VALUES(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#"> + 2)
</cfquery>