2010-08-26 143 views
10

是否有工具可以將一個數據庫的一個SQL查詢轉換爲另一個數據庫?將SQL查詢轉換爲其他數據庫

SQLite的

> CREATE TABLE ConstantValues( Id int 
> AUTOINCREMENT primary key , 
> VariableName varchar(50) , Values 
> varchar(150)) 

對於SQL Server

> CREATE TABLE ConstantValues( Id 
> INTEGER identity(1,1) primary key , 
> VariableName varchar(50) , Values 
> varchar(150)) 

同樣它是Oracle和SQL Server不同。同樣在外鍵約束聲明中,如果有一個工具可以讓我們從任何數據庫獲取SQL到任何數據庫,那對我來說真的很有幫助。

我創建了這樣的功能,但它似乎並沒有得到很好的解決:

private string changeSQL(string sql) 
{ 
    switch (dbtype) 
    { 
     case dbType.SQLite: 
      sql = sql.Replace(" int ", " INTEGER "); 
      sql = sql.Replace(" identity(1,1) ", " AUTOINCREMENT "); 
      break; 
     case dbType.MsAscess: 
      sql = sql.Replace(" int ", " "); 
      sql = sql.Replace(" identity(1,1) ", ""); 
      sql = sql.Replace("AUTOINCREMENT", "AUTOINCREMENT"); 

      break; 
    } 
    return (sql); 
} 

同樣SQLite的,拼接完成使用||而在SQL Server它使用+完成。

+1

只是審查了被移植這樣從甲骨文到MSSQL一個第三方應用程序。他們編寫代碼來實現SEQUENCES。除了簡單的情況外,切換RDBMS還應該涉及數據庫的重新設計。 – Bill 2010-09-07 19:22:12

+0

不要忘記標記答案如果你有你想要的信息.. – 2012-05-08 11:02:17

回答

6

SwisSQL Console 5.0

控制檯提供了一個即時的解決方案,提供快速,可靠的SQL查詢轉換工具,加快遷移。控制檯支持跨Oracle,SQL Server,IBM DB2,MySQL,Sybase,PostgreSQL,Informix和Netezza數據庫遷移。該軟件還具有測試目標數據庫中已轉換的SQL的功能。

+0

我認爲它的唯一工具!但爲什麼呢,這些工具應該是很多人開發的,我也想開發一個呢! – Thunder 2010-09-03 04:43:15

+0

@ Thunder:SQL是一種非常複雜的語言,每個供應商都有不同的方言。從一種方言翻譯到另一種方言很難100%正確。這就是爲什麼沒有很多工具可以做到這一點。甚至沒有很多工具可以很好地處理多個數據庫。 – 2010-09-08 17:50:20

2

如果我要支持多個數據庫管理系統,我會徹底完成,併爲每個系統提供數據訪問層。當然,這需要一定量的工作,但模塊化將會非常有益。

另一個我很滿意的選擇是DevExpress的XPO。這是一個支持多個數據庫的對象關係映射系統。您可以設計您的類,定義適當的連接字符串,併爲您創建數據庫模式,並且可以在代碼中輕鬆地將crud應用於類。爲了使用不同的數據庫系統,只需更改連接字符串!

並且不,我不像DevExpress那樣隸屬於非常高興的客戶。

http://www.devexpress.com/Products/NET/ORM/info.xml

4

首先你需要知道和了解每一個SQL引擎支持不同的SQL語法。儘管有SQL ANSI標準,但地球上的任何語言都不會100%地尊重它。而且,每個大型且已知的SQL引擎都會將自己的方法和內容添加到原始語法中。

所以,如果你想做一個轉換,最簡單的方法是實現一箇中間的SQL層。這意味着,要用每個衆所周知的SQL引擎中的常見功能創建一個不可知的SQL語法(這將導致類似於SQL ansi以及每個引擎中的每個功能(如TOP))。一旦你有了這個,你必須轉換到這個中間層,並從這個中間層爲你需要的每個SQL變體。

我告訴過你,因爲我在工作中需要這個確切的東西,而這是實現它的唯一方法,並且使它可重用。擁有一個工具可以爲您提供實際手動轉換每一個查詢的工作,併爲查詢選擇大型SWITCH或爲每個引擎都創建一個繼承類。

我告訴你我做了什麼:我創建了我的SQL中間語法的BNF,然後使用GoldParser爲C#創建了一個樹分析器。然後,我爲語法中的每條規則創建了單獨的規則,以將其轉換爲每個SQL方言。我知道這是一項艱鉅而乏味的工作。但他們支付我這樣做...

如果您沒有時間來完成此操作,可以使用ODBC。每個SQL引擎都有一個ODBC連接器,並且ODBC本身將充當中間抽象層。但是,它並不像聽起來那麼快樂,因爲只有簡單的查詢才能保持這種幻想......像UNION,JOIN和元數據創建這樣的難題不會一樣。

我希望它的幫助下,

好運

+1

我碰巧遇到同樣的情況,爲我們的軟件產品轉換MSSQL,Oracle,MySQL,ACCESS的sql查詢。你可以讓你的代碼開源嗎?我認爲這對初學者會有幫助。謝謝你的工作。 – 2016-02-16 14:24:04

1

這不是一個自動化的工具,但我發現對於理解不同的SQL實現之間的差異最好的資源是O'Reilley的SQL食譜安東尼莫利納羅。 http://oreilly.com/catalog/9780596009762/

他演示瞭如何用聰明的SQL查詢解決許多不同的問題,包括在使用不同語法或專有特性時爲Oracle,SQL Server,DB2,MySQL和Postgres提供並排解決方案。考慮到他們的系統如何不同,更改代碼以使用其他數據庫更容易。

Molinaro在解釋窗口查詢(或Oracle稱爲分析查詢)方面做得很好,因爲您可以非常高效地完成事務,而且查詢以前需要浪費帶寬的自定義客戶端代碼和時間。

-1

給我關於查詢轉換器的詳細信息DIFF數據庫

那你ARTICAL「轉換SQL查詢不同的數據庫」