转换不同数据库的SQL查询

时间:2010-08-26 06:08:49

标签: c# .net sql database

是否有工具可以将一个数据库的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中则使用+进行连接。

6 个答案:

答案 0 :(得分:6)

SwisSQL Console 5.0

Console提供即时解决方案,提供快速可靠的SQL查询转换实用程序,可加速迁移。控制台支持跨Oracle,SQL Server,IBM DB2,MySQL,Sybase,PostgreSQL,Informix和Netezza数据库的迁移。该软件还具有测试目标数据库中转换后的SQL的功能。

答案 1 :(得分: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和元数据创建这样的硬件将不会是相同的。

我希望它有所帮助,

祝你好运

答案 2 :(得分:2)

如果我支持多个数据库管理系统,我会彻底完成,每个系统都有一个数据访问层。当然,它需要一些工作量,但模块化将是非常有益的。

我很满意的另一种选择是DevExpress的XPO。它是一个支持多个数据库的对象关系映射系统。您可以设计类,定义正确的连接字符串,并为您创建数据库模式,并且可以在代码中轻松地将crud应用于类。要使用其他数据库系统,只需更改连接字符串!

不,除了作为一个非常高兴的客户之外,我不是DevExpress的附属公司。

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

答案 3 :(得分:1)

这不是一个自动化工具,但是我发现的用于理解不同SQL实现之间差异的最佳资源是Anthony Molinaro的O'Reilley的SQL Cookbook。 http://oreilly.com/catalog/9780596009762/

他展示了如何通过巧妙的SQL查询解决许多不同的问题,包括在使用不同的语法或专有功能时,为Oracle,SQL Server,DB2,MySQL和Postgres提供并排解决方案。在给出系统差异的描述时,更改代码以使用不同的数据库会更容易。

Molinaro在解释窗口查询(或Oracle称之为分析查询)方面也做得非常好,值得花时间学习,因为您可以使用以前需要浪费带宽的自定义客户端代码的查询非常有效地完成工作。时间。

答案 4 :(得分:0)

jOOQ具有一个SQL解析器,并且可以为各种目标方言生成一个SQL表达式树。您可以免费使用https://feedback.azure.com/forums/34192--general-feedbackjOOQ as a Java SQL parser library,也可以直接在网站上免费使用:command line tool

您的输入查询:

feedback website

为SQL Server产生以下输出查询:

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

(免责声明:我为jOOQ背后的公司工作)

答案 5 :(得分:-1)

向我提供有关不同数据库的查询转换器的详细信息

这是你的文章“为不同的数据库转换SQL查询”