Как создать переносимые вставки из SQL Server? - PullRequest
3 голосов
/ 14 марта 2011

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

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 ]

3 голосов
/ 14 марта 2011

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

Избавьтесь от квадратных скобок. В вашем случае они не нужны - даже в 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 не поддерживает это. Так что это вам не очень поможет.

2 голосов
/ 14 марта 2011

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

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

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

0 голосов
/ 15 марта 2011

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

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

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

...