【问题标题】:Convert SQL query for a different database为不同的数据库转换 SQL 查询
【发布时间】:2010-08-26 06:08:48
【问题描述】:

有没有一种工具可以将一个数据库的一个 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 中是使用 + 完成的。

【问题讨论】:

  • 刚刚查看了一个像这样从 Oracle 移植到 MSSQL 的第 3 方应用程序。他们编写代码来实现 SEQUENCES。除了在简单的情况下,切换 RDBMS 还应该重新设计数据库。
  • 如果你得到了你想要的信息,不要忘记将答案标记为已接受..

标签: c# .net sql database


【解决方案1】:

SwisSQL Console 5.0

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

【讨论】:

  • 我认为它是唯一的工具!但是为什么呢,这样的工具应该很多人开发的,我也想开发一个!
  • @Thunder:SQL 是一种极其复杂的语言,每个供应商都有不同的方言。从一种方言翻译成另一种方言很难做到 100% 正确。这就是为什么没有很多工具可以做到这一点。甚至没有多少工具能很好地处理多个数据库。
  • 该链接不再有效。 TLD 显示与manageengine.com 相同的内容。在这个领域似乎已经进行了一系列收购。是否还有衍生产品与 SwisSQL 过去所做的事情相同?
【解决方案2】:

首先,您需要了解并理解每个 SQL 引擎都使用不同的 SQL 语法。尽管有 SQL ANSI 标准,但地球上没有任何语言 100% 尊重它。此外,每一个已知的大型 SQL 引擎都会在原始语法中添加自己的方法和内容。

因此,如果要进行转换,最简单的方法是实现中间 SQL 层。这意味着,从每个众所周知的 SQL 引擎中的非常常见的特性中创建一个不可知的 SQL 语法(这将导致类似于 SQL ansi 以及每个引擎中存在的每个特性,如 TOP)。一旦你有了这个,你必须转换到这个中间层,并从这个中间层为你需要的每个 SQL 变体。

我告诉你这个是因为我在工作中需要这个确切的东西,这是真正实现它并使其可重用的唯一方法。拥有一个工具可以让您实际手动转换每个查询,并制作巨大的 SWITCH 来选择查询,或者为每个引擎拥有一个继承的类。

我告诉你我做了什么:我创建了我的 SQL 中间语法的 BNF,然后使用 GoldParser for C# 创建了一个树解析器。然后,我为语法中的每个规则创建了单独的规则,以将其转换为每个 SQL 方言。我知道,这是一项庞大而乏味的工作。但他们付钱让我这样做......

如果您没有时间完成此操作,您可以使用 ODBC。每个 SQL 引擎都有一个 ODBC 连接器,而 ODBC 本身将充当一个中间抽象层。但是,它并不像听起来那么愉快,因为只有简单的查询才能维持这种错觉......像 UNION、JOIN 和元数据创建这样的硬东西不会一样。

希望对你有帮助

祝你好运

【讨论】:

  • 我在为我们的软件产品转换MSSQL、Oracle、MySQL、ACCESS的sql查询时碰巧遇到了同样的情况。你能让你的代码开源吗?我认为这对初学者会有帮助。谢谢你的工作。
  • @Alejandro 是否有与您的方法类似的开源代码?真的也需要这个,因为对于 Oracle SQL、MSSQL 等的不同转换。
【解决方案3】:

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

我非常满意的一个替代方案是 DevExpress 的 XPO。它是一个支持多个数据库的对象关系映射系统。你设计你的类,定义一个适当的连接字符串,数据库模式将为你创建,你可以在代码中轻松地将 crud 应用到你的类。为了使用不同的数据库系统,只需更改连接字符串!

不,除了作为一个非常满意的客户之外,我不隶属于 DevExpress。

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

【讨论】:

    【解决方案4】:

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

    他展示了如何使用巧妙的 SQL 查询解决许多不同的问题,包括在 Oracle、SQL Server、DB2、MySQL 和 Postgres 使用不同的语法或专有特性时提供并行解决方案。考虑到它们的系统有何不同,更改代码以使用不同的数据库要容易得多。

    Molinaro 还很好地解释了值得花时间学习的窗口查询(或 Oracle 所谓的分析查询),因为您可以使用以前需要自定义客户端代码的查询非常有效地完成任务,而这会浪费带宽和时间。

    【讨论】:

      【解决方案5】:

      jOOQ 有一个 SQL 解析器,可以为各种目标方言生成一个 SQL 表达式树。您可以使用jOOQ as a Java SQL parser library、command line tool,也可以直接在网站上免费使用:https://www.jooq.org/translate

      您的输入查询:

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

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

      create table CONSTANTVALUES (
        Id int identity(1, 1) not null,
        VariableName varchar(50),
        Values varchar(150),
        primary key (Id)
      )
      

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

      【讨论】:

        【解决方案6】:

        给我有关差异数据库查询转换器的详细信息

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

        【讨论】:

          猜你喜欢
          • 2019-09-04
          • 2021-09-14
          • 2016-08-24
          • 2017-07-09
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多