受 Microsoft JDBC 驱动程序的 SELECT INTO 查询影响的行数

Posted

技术标签:

【中文标题】受 Microsoft JDBC 驱动程序的 SELECT INTO 查询影响的行数【英文标题】:Count of rows affected by SELECT INTO query with Microsoft JDBC driver 【发布时间】:2017-03-03 08:03:41 【问题描述】:

有没有办法为

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

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

我尝试了executeQuery,但它没有返回ResultSet。我尝试了executeUpdate,但结果总是得到-1,我尝试了execute,但返回值似乎是false,所以没有ResultSet。 我从 31.01.2017 下载了 MS JDBC 驱动程序 6.0,因为我读到了旧版本的问题。

【问题讨论】:

SELECT * FROM TableA 不会为您提供所需的结果集吗?它将包含您的SELECT INTO 已插入TableB 的所有行。如果您知道TableA 可能会被外部修改,您也可以将两者包含在事务中。 使用executeUpdate 是正确的方法。众所周知,MS JDBC 驱动程序质量低下,因此您总是得到-1 可能是驱动程序的错。如果使用jtDS 驱动程序可以获得更好的结果,您可能想尝试一下。 ok thx,然后就像我想的那样,ms jdbc 解决了这个问题。 【参考方案1】:

更新:此问题已在 JDBC Driver for SQL Server 的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

【讨论】:

以上是关于受 Microsoft JDBC 驱动程序的 SELECT INTO 查询影响的行数的主要内容,如果未能解决你的问题,请参考以下文章

登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。

连接异常:CannotGetJdbcConnectionException:无法加载 JDBC 驱动程序类 ["com.microsoft.sqlserver.jdbc.SQLServerD

无法加载驱动程序类:com.microsoft.jdbc.sqlserver.SQLServerDriver

Microsoft SQL Server JDBC 驱动程序支持矩阵

适用于 Oracle 和 JDBC 的 Microsoft ODBC

java.sql.SQLException:找不到适合 jdbc:microsoft:sqlserver 的驱动程序