2017-03-03 55 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