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

时间:2012-01-31 20:24:24

标签: 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语句还需要一些额外的格式吗?还是出了别的问题?

2 个答案:

答案 0 :(得分: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语法)

答案 1 :(得分:0)

我不相信你可以使用这样的参数指定名称 - 该部分需要成为SQL本身的一部分。只能参数化。