亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以確定哪些行受 SQL Server UPDATE 影響?

是否可以確定哪些行受 SQL Server UPDATE 影響?

達令說 2021-10-27 16:42:16
我正在使用 Java 程序更新 SQL Server 2017 數據庫。目前,在測試我的UPDATE語句時,我沒有提交更改 ( connection.setAutoCommit(false))。當我打印出受影響的行數時,計數遠低于預期(UPDATE 語句應該更新每一行)。下面是一些示例代碼,演示了我用來發出UPDATE語句的循環:    // List of users that need to be updated    List<User> updatedUsers = new ArrayList<>();    // Connect to database    Connection connection = null;    connection = DataFiles.getServerConnection();    connection.setAutoCommit(false);    PreparedStatement preparedStatement = null;    int rowsAffected = 0;    final int batchSize = 1000;    int count = 0;    // Create an UPDATE statement for each record to be updated    for (User user : updatedUsers) {        StringBuilder sql = new StringBuilder(                "UPDATE USERS SET\n"        );        sql.append("USER_TYPE=?,\n")                .append("FIRST_NAME=?,\n")                .append("LAST_NAME=?,\n")                .append("EMAIL_ADDRESS=?\n");        sql.append("WHERE USER_ID=?");        // Fill each ?        preparedStatement = connection.prepareStatement(sql.toString());        preparedStatement.setString(1, user.getUserTypeId());        preparedStatement.setString(2, user.getFirstName());        preparedStatement.setString(3, user.getLastName());        preparedStatement.setString(4, user.getEmailAddress());        preparedStatement.setString(5, user.getUserId());        preparedStatement.addBatch();        // Submit in batches of 1000        if (++count % batchSize == 0) {            rowsAffected += IntStream.of(preparedStatement.executeBatch()).sum();            preparedStatement.clearBatch();        }    }    System.out.println(count);    rowsAffected += IntStream.of(preparedStatement.executeBatch()).sum();    preparedStatement.clearBatch();    preparedStatement.close();    System.out.println(rowsAffected + " rows affected!");我的WHERE語句應該為循環的每一次傳遞匹配一條記錄,但我得到的33 rows affected不是我期望的 32,000。有沒有辦法返回受影響的行?我想將匹配項與不匹配的項進行比較。我已經嘗試將我的循環調整為SELECT具有相同WHERE條件的語句并返回所有 32,000 條記錄,因此我確信這些記錄確實存在。
查看完整描述

1 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

您正在循環的每次迭代中創建一個新的 PreparedStatement。您需要在調用 executeBatch 的同一個 PreparedStatement 對象上排隊執行批處理。目前您只執行第 1000 個排隊查詢。


StringBuilder sql = new StringBuilder(

    "UPDATE USERS SET\n"

);


sql.append("USER_TYPE=?,\n")

    .append("FIRST_NAME=?,\n")

    .append("LAST_NAME=?,\n")

   .append("EMAIL_ADDRESS=?\n");

sql.append("WHERE USER_ID=?");


preparedStatement = connection.prepareStatement(sql.toString());


for (User user : updatedUsers) {

        preparedStatement.setString(1, user.getUserTypeId());

        preparedStatement.setString(2, user.getFirstName());

        preparedStatement.setString(3, user.getLastName());

        preparedStatement.setString(4, user.getEmailAddress());

        preparedStatement.setString(5, user.getUserId());

        preparedStatement.addBatch();


        // Submit in batches of 1000

        if (++count % batchSize == 0) {

            rowsAffected += IntStream.of(preparedStatement.executeBatch()).sum();

            preparedStatement.clearBatch();

        }

}

為了確定受影響的行(在 sql server 2005+ 中),您可以在 SQL 中使用 OUTPUT 子句讓數據庫返回受影響的行數據。文章


查看完整回答
反對 回復 2021-10-27
  • 1 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號