2012-01-31 10 views
0

私は次のようにMSSQL 2008データベース内のレコードを更新し、交換するためにJavaでPreparedStatementを使用しています: 正しくない構文

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ステートメントもいくつかの追加のフォーマットが必要なのでしょうか?それとも何か他にうまくいかないのですか?

答えて

0

カラムという名前を、このようなパラメータを使用して指定することはできません - その部分はSQL自体の一部である必要があります。 のみをパラメータ化できます。

+0

私は、 'UPDATE table SET? =?どこですか? =?たくさんあるので、私は可能だと思います – Freek8

+0

@ Freek8:本当ですか?どのデータベースシステムで、どのような言語で? –

+0

JDBCとMSSQLの使用 – Freek8

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の構文)

関連する問題