2012-01-31 121 views
0

我在Java中使用一個PreparedStatement更新,並在2008年MSSQL數據庫替換記錄如下: 不正確的語法

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語句在參數化語句中使用時應該用括號括起來。

難道這是更新聲明還需要一些額外的格式之前,我可以使用它?或者是其他事情出錯了?

回答

0

我不相信你可以使用這樣的參數指定名稱 - 該部分需要成爲SQL本身的一部分。只有可以參數化。

+0

我用來執行窗體'更新表SET的更新? =?哪裏? =?很多,所以應該有可能我認爲 – Freek8 2012-01-31 20:31:34

+0

@ Freek8:真的嗎?用什麼數據庫系統,什麼語言? – 2012-01-31 20:34:23

+0

使用JDBC和MSSQL – Freek8 2012-01-31 20:36:12

1

如前所述,列名不是綁定參數。語句中的動態列名更接近動態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語法)