Типичные различия включают слегка различную семантику (например, в некоторых случаях Oracle обрабатывает значения NULL по-разному от других диалектов SQL), разные механизмы обработки исключений, разные типы и собственные методы для выполнения таких операций, как строковые операции, операции с датами или иерархические запросы.Подсказки к запросам также обычно имеют синтаксис, который варьируется в зависимости от платформы, и разные оптимизаторы могут запутаться в разных типах конструкций.
Можно использовать ANSI SQL по большей части в системах баз данных и ожидать получения разумных результатов набаза данных без существенных проблем настройки, таких как отсутствующие индексы.Тем не менее, в любом нетривиальном приложении, вероятно, существует некоторое требование к коду, который не может быть легко выполнен переносимым.
Как правило, это требование будет достаточно локализовано в базе кода приложения - несколько запросов, где этовызывает проблему.Отчетность с гораздо большей вероятностью вызовет проблему такого типа, а выполнение общих запросов отчетов, которые будут работать между менеджерами баз данных, вряд ли будет работать хорошо.Некоторые приложения чаще вызывают горе, чем другие.
Следовательно, маловероятно, что использование «переносимых» конструкций SQL для приложения будет работать в общем случае.Лучшая стратегия состоит в том, чтобы использовать общие операторы, где они будут работать, и переходить на уровень, специфичный для базы данных, где это не работает.
Общий механизм запросов мог бы заключаться в использовании ANSI SQL, где это возможно;Другой возможный подход заключается в использовании O / R Mapper, который может принимать драйверы для различных платформ баз данных.Механизм такого типа должен подойти для большинства операций с базой данных, но потребует от вас выполнения определенной работы, связанной с платформой, когда она исчерпывается.
Возможно, вы сможете использовать хранимые процедуры в качестве уровня абстракции для большегосложные операции и кодирование набора специфичных для платформы sprocs для каждой целевой платформы.Доступ к sprocs можно получить через что-то вроде ADO.net.
На практике тонкие различия в передаче параметров и обработке исключений могут вызвать проблемы с этим подходом.Лучшим подходом является создание модуля, объединяющего операции базы данных для платформы с общим интерфейсом.В зависимости от используемой вами платформы СУБД можно менять и вставлять разные модули драйверов.