Выбор грамматики SQL
Первое решение при создании инструкций SQL заключается в том, какую грамматику следует использовать. Помимо грамматики, доступной из различных органов стандартов, таких как Open Group, ANSI и ISO, практически каждый поставщик СУБД определяет свою собственную грамматику, каждый из которых немного отличается от стандарта.
Приложение C. Грамматика SQL описывает минимальную грамматику SQL, которую должны поддерживать все драйверы ODBC. Эта грамматика представляет собой подмножество уровня входа SQL-92. Драйверы могут поддерживать дополнительную грамматику в соответствии с промежуточными, полными или FIPS 127-2 переходными уровнями, определенными SQL-92. Дополнительные сведения см. в разделе "Минимальная грамматика SQL" в приложении C: грамматика SQL и SQL-92.
Приложение C также определяет escape-последовательности, содержащие стандартную грамматику для распространенных языковых функций , таких как внешние соединения, которые не охватываются грамматикой SQL-92. Дополнительные сведения см. в разделе "Escape-последовательности ODBC" в приложении C: грамматика SQL и escape-последовательности далее в этом разделе.
Выбранная грамматика влияет на то, как драйвер обрабатывает инструкцию. Драйверы должны изменять SQL-92 SQL и определяемые ODBC escape-последовательности в SQL для конкретных СУБД. Так как большинство грамматик SQL основаны на одном или нескольких различных стандартах, большинство драйверов выполняют мало или не работают над этим требованием. Он часто состоит только из поиска escape-последовательностей, определенных ODBC, и замены их грамматикой для СУБД. Когда драйвер обнаруживает грамматику, она не распознает, предполагается, что грамматика зависит от СУБД и передает инструкцию SQL без изменения в источник данных для выполнения.
Поэтому существует два варианта использования грамматики: грамматика SQL-92 (и escape-последовательности ODBC) и грамматика для СУБД. Из двух, только грамматика SQL-92 совместима, поэтому все приложения взаимодействия должны использовать его. Приложения, которые не взаимодействуют, могут использовать грамматику SQL-92 или грамматику для СУБД. Грамматики, относящиеся к СУБД, имеют два преимущества: они могут использовать любые функции, не охватываемые SQL-92, и они немного быстрее, так как драйвер не должен изменять их. Последняя функция может быть частично применена, задав атрибут инструкции SQL_ATTR_NOSCAN, который останавливает драйвер от поиска и замены escape-последовательностей.
Если используется грамматика SQL-92, приложение может узнать, как он изменяется драйвером, вызвав SQLNativeSql. Это часто полезно при отладке приложений. SQLNativeSql принимает инструкцию SQL и возвращает ее после изменения драйвера. Так как эта функция находится на уровне соответствия основного интерфейса, она поддерживается всеми драйверами.