Как создать переносимые вставки из 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. Размер этой загрузки должен быть достаточным, чтобы убедить вас, насколько сложной может быть эта проблема.