java - Update 语句中 @po 附近的语法不正确

标签 java sql prepared-statement

我正在使用 Java 中的 preparedStatement 来更新和替换 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 语句时,应将其括在括号中。

是否 Update 语句还需要一些额外的格式才能使用它?或者还有其他问题吗?

最佳答案

如前所述,列名不是绑定(bind)参数。语句中的动态列名更接近于动态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语法)

关于java - Update 语句中 @po 附近的语法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086396/

相关文章:

php - mysqli准备语句缓冲数据与非缓冲数据性能?

java - 如何在 MYSQL 数据库中保存 JPasswordField 字符

java - DynamoDBMapper : How to get all the rows for multiple id's(array) in a single query or scan of DynamoDBMapper

sql - 在 Oracle IN 子句中使用 LIKE

mysql - 有没有办法通过使用时间戳进行比较来删除最近的行

mysql - SQL输出精简

php - 准备好的语句不允许我调用 $mysqli->stmt_init()

java - cache2k 和 Generic T 不能很好地结合在一起

java - JTable多选不使用键盘只使用鼠标

java - 我如何获取我点击的卡片 View 的信息并将其发送到下一个 Activity