Как создать переносимые вставки из SQL Server?

Теперь он генерирует вставки как

INSERT [Bla] ([id], [description], [name], [version])
VALUES (CAST(1 AS Numeric(19, 0)), convert(t...

Это очень специфично для SQL Server. Я хотел бы создать сценарий, который может использовать каждый, независимо от базы данных. У меня есть очень простые типы данных - varchars, числа, даты, биты (булево).

Я думаю

insert into bla values (1, 'die', '2001-01-01 11:11:11')

должно работать во всех СУБД, верно?

3 ответа

Решение

Некоторые основные правила:

Избавьтесь от квадратных скобок. В вашем случае они не нужны - даже в SQL Server. (При этом убедитесь, что вы никогда не используете зарезервированные слова или специальные символы в именах столбцов или таблиц).

Если вам нужно использовать специальные символы или зарезервированные слова (что я бы не рекомендовал), используйте стандартные двойные кавычки (например, "GROUP").

Но помните, что имена чувствительны к регистру: my_table такой же как MY_TABLE но "my_table" отличается от "MY_TABLE" в соответствии со стандартом. Опять же, это может варьироваться в зависимости от СУБД и их конфигурации.

Оператор CAST является стандартным и работает на большинстве СУБД (хотя не все поддерживают приведение типов во всех возможных комбинациях).

Функция convert() специфична для SQL Server и должна быть заменена условным выражением CAST.

Старайтесь указывать значения в правильном типе данных, никогда не полагайтесь на неявное преобразование данных (поэтому не используйте "1" для числа). Хотя я не думаю, что приведение 1 к числовому () должно быть необходимо.

Обычно я также рекомендую использовать литералы ANSI (например, DATE '2011-03-14') для литералов DATE/TIMESTAMP, но SQL Server не поддерживает это. Так что это вам не очень поможет.

Беглый взгляд на статью Википедии по SQL, расскажет вам немного о стандартизации SQL в различных реализациях, таких как MS SQL, PostgreSQL, Oracle и т. Д.

Короче говоря, существует ряд стандартов ANSI, но существует разная поддержка для каждого продукта.

Общий способ поддержки нескольких серверов баз данных из вашего программного продукта состоит в том, чтобы признать наличие различий, кодировать их на уровне базы данных и предоставить вашему приложению возможность вызывать один и тот же код доступа к базе данных независимо от сервера базы данных.

Существует ряд проблем с числовыми форматами, которые не будут портировать между dbmses, однако это бледнеет, когда вы смотрите на проблемы с датами и форматами дат. Например, формат DATE по умолчанию, используемый в БД ORACLE, зависит от прихоти того, кто устанавливал программное обеспечение, вы можете использовать функции преобразования даты, чтобы ORACLE мог принимать общие форматы даты - но эти функции специфичны для ORACLE.

Кроме того, откуда вы знаете, что имена таблиц и столбцов на целевой БД будут одинаковыми?

Если вы серьезно относитесь к этому, вам действительно нужно портировать данные между водородными СУБД, и вы немного знаете, что можете попробовать использовать SqlFairy, доступный в CPAN. Размер этой загрузки должен быть достаточным, чтобы убедить вас, насколько сложной может быть эта проблема.

Другие вопросы по тегам