2012-09-04 19 views
0

我試過尋找類似的問題,但我可以找到一個,所以我會發佈一個!我創建下降某些表對我來說是Java程序,MySQL的一個看起來是這樣的:刪除Java應用程序中存在的查詢

String[] tablesToDrop = new String[]{tableName,tableName2}; 
Connection con = DriverManager.getConnection(dbUrl, userName,password); 
Statement stmt = con.createStatement(); 

for (int i = 0; i < tablesToDrop.length; i++) { 
       System.out.println("Dropping " + tablesToDrop[i] + " Table.."); 
       stmt.executeUpdate("DROP TABLE IF EXISTS " + tablesToDrop[i]); 
      } 

我的問題是如何將這個樣子的SQL Server 2008版本? stmt.executeUpdate(???); 部分?如果存在,我想刪除一個表,從數組中獲取表名並將其傳遞給for循環。

+0

不是sqlserver的專家,但http://www.sqlservercentral.com/forums/Topic478289-338-1.aspx – gefei

+2

雖然給出的答案會的工作,我建議讓您的應用程序刪除表是不好的做法和潛在的危險,允許應用程序對數據庫的訪問過多。 我建議使用臨時表或表變量來代替瞬態數據結構。 – podiluska

+0

這很奇怪,這個人編輯我的帖子太多了,它似乎與Java無關,但它確實如此。這傢伙甚至讀過我的帖子還是隨機更改了標籤? -.- – Mantas

回答

2
IF EXISTS(select * from sysobjects where name='tblname') drop table tblname 
+0

謝謝,希望這能起作用,因爲我還沒有在公司建立測試數據庫,現在不能在實時系統上嘗試這些東西。 – Mantas

+0

所以聲明應該是這樣的: stmt.executeUpdate(「IF EXISTS(select * from sysobjects where name ='tablesToDrop [i]')DROP TABLE tablesToDrop [i]); ? – Mantas

4

Java通過驅動程序與DB通信。對於應用程序員來說,它必須是絕對透明的。所以,MySql和MS SQL服務器沒有區別。只需更換司機。

但是,它可能是SQL方言的區別。通常情況下,人們試圖通過使用Java到數據庫映射框架(例如JPA,Hibernate等)來避免這種差異。但是,由於您使用普通JDBC,因此您有責任。

我認爲你現在正在嘗試的陳述將起作用。但是爲了將來如果你想使用普通的JDBC並支持多種數據庫類型,我建議你將SQL語句保存在單獨的文件(例如屬性文件)中,並從那裏讀取它們。你甚至可以濫用使用SQL方言作爲「語言環境」的ResouceBundle機制。

+0

+1答案很好,因爲它解釋了很多事情。我想添加一個鏈接到另一篇文章,因爲方言有所不同:http://stackoverflow.com/questions/7887011/how-to-drop-table-if-exists-in-sql-server-2005 –

+0

我的驅動程序發生動態變化,它檢測到我要連接的是哪個類型的數據庫,但查詢是在服務器本身內執行的。這個計劃是針對一個有着多年結構的公司,我會這樣做,但目前我沒有公司在這方面:) – Mantas

+0

是的,它解釋了很多,我也是+1,但我是隻是尋找要執行的查詢,謝謝先生。 – Mantas