更新语句中@po 附近的语法不正确

Posted

技术标签:

【中文标题】更新语句中@po 附近的语法不正确【英文标题】:incorrect syntax near @po in Update-statement 【发布时间】:2012-01-31 20:24:23 【问题描述】:

我正在使用 Java 中的 prepareStatement 来更新和替换 MSSQL 2008 数据库中的记录,如下所示:

ps = settings.conn.prepareStatement("UPDATE table SET ? = replace((?), (?), (?)) ");

然后我按如下方式传递参数:

String[] columns= "a", "b", "c", "d";
for (int i = 0; i < columns.length; i++) 
  ps.setString(1, columns[i]);
  ps.setString(2, columns[i]);
  ps.setString(3, " " + oldName.trim() + " ");
  ps.setString(4, " " + newName.trim() + " ");
  ps.addBatch();

  batchSize++;
  if (batchSize > 5000) 
    batchSize = 0;
    ps.executeBatch();
  

我收到很多错误消息,提示 @po 附近的语法不正确。从this question 我了解到,当在参数化语句中使用 Top-statement 时,它应该用括号括起来。

难道更新语句还需要一些额外的格式才能使用它吗?还是有其他问题?

【问题讨论】:

【参考方案1】:

如前所述,列名不是绑定参数。语句中的动态列名更接近于动态 sql。如果语句的结构是动态的,sql server 不能真正解析和准备语句。

看起来该示例正在尝试实现以下目标:

UPDATE table SET a = replace((a), (?), (?))
                ,b = replace((b), (?), (?))
                ,c = replace((c), (?), (?))
                ,d = replace((d), (?), (?))

如果目的不是更新所有列,而只是更新其中的一部分,您可以执行以下操作:

UPDATE table SET a = NVL2(?, replace((a), (?), (?)), a)
                ,b = NVL2(?, replace((b), (?), (?)), b)
                ,c = NVL2(?, replace((c), (?), (?)), c)
                ,d = NVL2(?, replace((d), (?), (?)), d)

如果列的输入参数为NULL,则将列值设置为与当前相同(即不要真正修改),否则将列值设置为计算结果。 (Oracle 语法)

【讨论】:

【参考方案2】:

我不相信您可以使用这样的参数指定 名称 - 该部分需要是 SQL 本身的一部分。只有可以被参数化。

【讨论】:

我曾经执行 'UPDATE table SET 形式的更新? = ?在哪里 ? = ?很多,所以我认为应该有可能 @Freek8:真的吗?使用什么数据库系统,使用什么语言? @Freek8:嗯……这对我来说似乎很奇怪。当您尝试将它用于列名或表名而不是值时,我当然已经看到它在其他系统上失败了。 过去一周我一直在使用它,但我也得到了奇怪的结果(虽然没有错误)。根据this 的问题,这确实是不可能的。我想我将不得不使用多个准备好的语句..

以上是关于更新语句中@po 附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章

关键字“with”附近的语法不正确...上一条语句必须以分号结束

SQL create语句自动递增附近的语法不正确

消息 102,级别 15,状态 1,第 1 行“日期”附近的语法不正确。在更新查询中[关闭]

存储过程错误附近的语法不正确

错误“关键字 'CONVERT' 附近的语法不正确”

SQL C# 使用 LIKE 和通配符生成 SQL 语句;在“bla”附近给出不正确的语法