使用Microsoft JDBC驱动程序

时间:2017-03-03 08:03:42

标签: java sql-server jdbc mssql-jdbc

有没有办法让

获得“受行影响”的结果
SELECT * INTO TableB FROM TableA

使用Microsoft的SQL Server JDBC驱动程序?当我在SQL Server Management Studio中执行该查询时,它以与DELETE,INSERT或UPDATE相同的方式返回行数。

我尝试了executeQuery,但它没有返回ResultSet。我尝试executeUpdate,但我总是得到-1,我尝试execute,但返回值似乎是false,因此没有ResultSet。 我从2017年1月31日起下载了MS JDBC驱动程序6.0,因为我读到了旧版本的问题。

1 个答案:

答案 0 :(得分:0)

更新:此问题已在SQL Server的JDBC驱动程序的version 6.1.5中得到修复。

<小时/> (上一个答案)

测试确认即使使用最新的Microsoft JDBC驱动程序(6.0.8112.100)

sql = "SELECT * INTO TableB FROM TableA";
try (Statement st = conn.createStatement()) {
    int n = st.executeUpdate(sql);
    System.out.printf("%d row(s) affected", n);
}

产生

-1 row(s) affected

,而jTDS驱动程序正确返回实际行数:

3 row(s) affected

Microsoft JDBC驱动程序的解决方法是使用匿名代码块返回包含@@ROWCOUNT的ResultSet

sql = 
        "SET NOCOUNT ON; " +
        "SELECT * INTO TableB FROM TableA; " +
        "SELECT @@ROWCOUNT AS n; ";
try (
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery(sql)) {
    rs.next();
    int n = rs.getInt(1);
    System.out.printf("%d row(s) affected", n);
}

正确返回

3 row(s) affected