受 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 驱动程序支持矩阵