C# 转换其他数据库的SQL查询

C# 转换其他数据库的SQL查询,c#,.net,sql,database,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, V

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


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

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

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

不,除了作为一个非常满意的客户之外,我与DevExpress没有任何关联


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

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

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

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

如果没有时间完成这项工作,可以使用ODBC。每个SQL引擎都有一个ODBC连接器,ODBC本身将充当中间抽象层。但是,这并不像听起来那么令人高兴,因为只有简单的查询才能维持这种错觉。。。像联合、连接和元数据创建这样的硬东西将不一样

我希望有帮助


祝你好运

这不是一个自动化的工具,但我找到的理解不同SQL实现之间差异的最佳资源是Anthony Molinaro编写的O'Reilley的SQL Cookbook。

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


Molinaro在解释窗口查询(或Oracle称之为分析查询)方面也做得很好,这些查询非常值得花时间学习,因为您可以通过一个查询非常高效地完成任务,而该查询以前需要自定义客户端代码,这会浪费带宽和时间

提供有关diff数据库查询转换器的详细信息


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

jOOQ有一个SQL解析器,可以为各种目标方言生成SQL表达式树。您可以免费使用或直接在网站上使用:

您的输入查询:

创建表常量值(
Id int自动递增主键,
VariableName varchar(50),
varchar值(150)
)
为SQL Server生成以下输出查询:

创建表常量值(
Id int标识(1,1)不为空,
VariableName varchar(50),
值varchar(150),
主键(Id)
)

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

我认为这是唯一的工具!但是为什么呢,这样的工具应该由很多人开发,我也在考虑开发一个@Thunder:SQL是一种极其复杂的语言,每个供应商都有不同的方言。从一种方言到另一种方言的翻译很难100%正确。这就是为什么没有很多工具可以做到这一点。甚至没有很多工具可以很好地处理多个数据库。这种链接不再有效。TLD显示与相同的内容。在这个领域似乎有一系列的收购。是否还有一个衍生产品可以做与SwisSQL相同的事情?刚刚回顾了一个第三方应用程序,它是这样从Oracle移植到MSSQL的。他们编写代码来实现序列。除了简单的情况外,切换RDBMS还需要重新设计数据库。如果您得到了所需的信息,请不要忘记将答案标记为已接受。我碰巧遇到了同样的情况,为我们的软件产品转换MSSQL、Oracle、MySQL和ACCESS的sql查询。你能让你的代码开源吗?我认为这对初学者会有帮助。谢谢你的工作。@Alejand