неверный синтаксис рядом с @po в Update-заявлении - PullRequest
0 голосов
/ 01 февраля 2012

Я использую подготовленное состояние в Java для обновления и замены записей в базе данных 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 . Из этого вопроса Я понимаю, что оператор Top должен быть заключен в скобки, когда он используется в параметризованном операторе.

Может ли быть так, что оператор Update также нуждается в некотором дополнительном форматировании, прежде чем я смогу его использовать? Или что-то не так?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Как упоминалось ранее, имя столбца не является параметром привязки.Динамическое имя столбца в операторе ближе к динамическому sql.Сервер sql не может реально проанализировать и подготовить оператор, если структура оператора является динамической.

Похоже, пример пытается достичь чего-то подобного:

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)

0 голосов
/ 01 февраля 2012

Я не верю, что вы можете указать имя столбца , используя такой параметр - эта часть должна быть частью самого SQL.Только значения могут быть параметризованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...