Escolhendo uma gramática SQL
A primeira decisão a ser tomada ao construir instruções SQL é qual gramática usar. Além das gramáticas disponíveis nos vários órgãos de normas, como Open Group, ANSI e ISO, praticamente todos os fornecedores de SGBD definem sua própria gramática, cada uma das quais varia ligeiramente do padrão.
Apêndice C: Gramática SQL, descreve a gramática SQL mínima que todos os drivers ODBC devem suportar. Essa gramática é um subconjunto do nível de entrada do SQL-92. Os drivers podem oferecer suporte a gramática adicional para estar em conformidade com os níveis de transição Intermediário, Completo ou FIPS 127-2 definidos pelo SQL-92. Para obter mais informações, consulte Gramática mínima do SQL no Apêndice C: Gramática SQL e SQL-92.
O Apêndice C também define sequências de escape contendo gramática padrão para recursos de idioma comumente disponíveis, como junções externas, que não são cobertas pela gramática SQL-92. Para obter mais informações, consulte Sequências de escape ODBC no Apêndice C: Gramática SQL e Sequências de escape, mais adiante nesta seção.
A gramática escolhida afeta como o driver processa a instrução. Os drivers devem modificar o SQL SQL-92 e as sequências de escape definidas por ODBC para SQL específico do DBMS. Como a maioria das gramáticas SQL é baseada em um ou mais dos vários padrões, a maioria dos drivers faz pouco ou nenhum trabalho para atender a esse requisito. Muitas vezes consiste apenas em procurar as sequências de escape definidas pelo ODBC e substituí-las por gramática específica do DBMS. Quando um driver encontra a gramática que ele não reconhece, ele assume que a gramática é específica do DBMS e passa a instrução SQL sem modificação para a fonte de dados para execução.
Portanto, há realmente duas opções de gramática para usar: a gramática SQL-92 (e as sequências de escape ODBC) e uma gramática específica do DBMS. Dos dois, apenas a gramática SQL-92 é interoperável, portanto, todos os aplicativos interoperáveis devem usá-la. Os aplicativos que não são interoperáveis podem usar a gramática SQL-92 ou uma gramática específica do DBMS. As gramáticas específicas do DBMS têm duas vantagens: podem explorar quaisquer recursos não cobertos pelo SQL-92 e são marginalmente mais rápidas porque o driver não precisa modificá-las. O último recurso pode ser parcialmente aplicado definindo o atributo de instrução SQL_ATTR_NOSCAN, que impede o driver de procurar e substituir sequências de escape.
Se a gramática SQL-92 for usada, o aplicativo poderá descobrir como ela é modificada pelo driver chamando SQLNativeSql. Isso geralmente é útil ao depurar aplicativos. SQLNativeSql aceita uma instrução SQL e a retorna depois que o driver a modifica. Como essa função está no nível de conformidade da interface principal, ela é suportada por todos os drivers.