2017-03-03 35 views
1

是否有一种方式来获得结果为计数行受到SELECT INTO查询使用Microsoft JDBC驱动程序

SELECT * INTO TableB FROM TableA 

与微软的JDBC驱动程序的SQL Server中的“受影响的行”?当我在SQL Server Management Studio中执行该查询时,它将以与DELETE,INSERT或UPDATE相同的方式返回行数。

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

+0

难道'选择*从TableA'给你你需要的结果集?它将包含您的'SELECT INTO'已经插入'TableB'中的所有行。如果您知道'TableA'可能会在外部修改,您也可以将它们放在一个事务中。 – SantiBailors

+0

使用'executeUpdate'将是正确的方法。 MS JDBC驱动程序的质量出众,所以您可能总是遇到'-1'的驱动程序错误。如果使用[jtDS](http://jtds.sourceforge.net/)驱动程序可以让您获得更好的结果,您可能需要尝试。 – Kayaman

+0

ok thx,那就像我想的那样,ms jdbc解决了问题。 – bAlaRk

回答

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 

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

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); 
} 

的ResultSet它不会返回正确

3 row(s) affected 
+0

从现在起我将使用jTDS,谢谢Gord和Kayaman。 – bAlaRk