Преобразование 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

SwisSQL Console 5.0

Консоль предлагает мгновенное решение, обеспечивающее быструю и надежную утилиту преобразования запросов SQL, которая ускоряет миграцию. Консоль поддерживает миграцию через базы данных Oracle, SQL Server, IBM DB2, MySQL, Sybase, PostgreSQL, Informix и Netezza. Это программное обеспечение также имеет функции для проверки преобразованных SQL в целевых базах данных.

Ответ 2

сначала вам нужно знать и понимать, что каждый движок SQL работает с другой грамматикой SQL. Несмотря на стандарт SQL ANSI, ни один язык на земле не оценивает его на 100%. Более того, каждый большой и известный механизм SQL добавляет собственные методы и материалы в оригинальную грамматику.

Итак, если вы хотите сделать преобразование, самым простым способом является достижение среднего уровня SQL. Это означает, что создать агностическую грамматику SQL из самых общих функций в каждом хорошо известном SQL-движке (это приведет к чему-то вроде SQL ansi плюс каждая функция, присутствующая в каждом движке, например TOP). После этого вы должны сделать преобразование в этот средний слой и из этого среднего слоя для каждого варианта SQL, который вам нужен.

Я сказал вам это, потому что мне нужна эта точная вещь в моей работе, и это был единственный способ добиться этого, и сделал его многоразовым. Наличие инструмента дает вам возможность фактически конвертировать каждый отдельный запрос вручную и делать огромные SWITCH только для выбора запроса или иметь унаследованный класс для каждого движка.

Я расскажу вам, что я сделал: я создал BNF моей средней грамматики SQL, а затем создал дерево-парсер с GoldParser для С#. Затем я создал отдельные правила для каждого правила в грамматике, которые будут преобразованы в каждый диалект SQL. Я знаю, это огромная и утомительная работа. Но они заплатили мне за это...

Если у вас нет времени для этого, вы можете использовать ODBC. Каждый SQL-механизм имеет ODBC-коннектор, а сам ODBC будет действовать как средний абстрактный слой. Но это не так радует, как кажется, потому что только простые запросы будут поддерживать эту иллюзию... жесткие вещи, такие как UNION, JOINs и создание метаданных, не будут одинаковыми.

Я надеюсь, что это помогло,

удача

Ответ 3

Если бы я поддерживал несколько систем управления базами данных, я бы сделал это тщательно, с уровнем доступа к данным для каждой системы. Разумеется, для этого потребуется определенная работа, но модульность была бы весьма полезной.

Один из вариантов, которым я вполне доволен, - это DevExpress 'XPO. Это система реляционного сопоставления объектов, которая поддерживает несколько баз данных. Вы разрабатываете свои классы, определяете правильную строку соединения, и схема базы данных будет создана для вас, и вы можете легко применять crud для своих классов в коде. Чтобы использовать другую систему баз данных, измените только строку соединения!

И нет, я не связан с DevExpress, кроме как очень довольного клиента.

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

Ответ 4

Это не автоматизированный инструмент, но лучший ресурс, который я нашел для понимания различий между различными реализациями SQL, - это O'Reilley SQL Cookbook от Anthony Molinaro. http://oreilly.com/catalog/9780596009762/

Он показывает, как решить множество различных проблем с умными SQL-запросами, включая представление боковых решений для Oracle, SQL Server, DB2, MySQL и Postgres, когда они используют разные синтаксические или фирменные функции. Изменение кода для работы с другой базой данных намного проще при описании описаний того, как они отличаются.

Molinaro также неплохо объясняет запросы на окна (или то, что Oracle называет аналитическими запросами), которые стоят времени, чтобы узнать, так как вы можете очень эффективно выполнять запрос, который ранее требовал настраиваемый клиентский код, который терял пропускную способность и время.

Ответ 5

расскажите мне подробности о конверторе запросов для баз данных diff.

thats your artical "Преобразовать SQL-запрос для другой базы данных"