Compartir a través de


Elección de una gramática de SQL

La primera decisión que se debe tomar al construir instrucciones SQL es la gramática que se va a usar. Además de las gramáticas disponibles en los distintos organismos de estándares, como Open Group, ANSI e ISO, prácticamente todos los proveedores de DBMS definen su propia gramática, cada una de las cuales varía ligeramente del estándar.

En el Anexo C: Gramática de SQL se describe gramática de SQL mínima que deben admitir todos los controladores ODBC. Esta gramática es un subconjunto del nivel de entrada de SQL-92. Los controladores pueden admitir gramática adicional para cumplir con el nivel intermedio, completo o de transición FIPS 127-2 según los define SQL-92. Para obtener más información, consulte Gramática mínima de SQL en el Anexo C: Gramática de SQL y SQL-92.

En el Anexo C también se definen las secuencias de escape que contienen gramática estándar para las características de lenguaje disponibles con frecuencia, como las combinaciones externas, que no están cubiertas por la gramática de SQL-92. Para obtener más información, consulte Secuencias de escape de ODBC en el Anexo C: Gramática de SQL y Secuencias de escape posteriormente en esta sección.

La gramática elegida afecta al modo en que el controlador procesa la instrucción. Los controladores deben modificar las secuencias de escape definidas por ODBC, SQL y SQL-92 para el lenguaje SQL específico de DBMS. Dado que la mayoría de las gramáticas de SQL se basan en uno o varios de los distintos estándares, la mayoría de los controladores no hacen nada o prácticamente nada para cumplir este requisito. A menudo se basa en buscar las secuencias de escape definidas por ODBC y reemplazarlas por la gramática específica de DBMS. Cuando un controlador encuentra gramática que no reconoce, supone que la gramática es específica de DBMS y pasa la instrucción SQL sin modificaciones al origen de datos para su ejecución.

Por lo tanto, hay realmente dos opciones de gramática que se pueden usar: la gramática SQL-92 (y las secuencias de escape de ODBC) y una gramática específica de DBMS. De las dos, solo la gramática SQL-92 es interoperable, por lo que todas las aplicaciones interoperables deben usarlas. Las aplicaciones que no son interoperables pueden usar la gramática SQL-92 o una gramática específica de DBMS. Las gramáticas específicas de DBMS tienen dos ventajas: pueden aprovechar las características que no cubre SQL-92 y son marginalmente más rápidas porque el controlador no tiene que modificarlas. Esta última característica se puede aplicar parcialmente estableciendo el atributo de instrucción SQL_ATTR_NOSCAN, lo que impide que el controlador busque y reemplace las secuencias de escape.

Si se usa la gramática SQL-92, la aplicación puede detectar cómo lo modifica el controlador mediante una llamada a SQLNativeSql. Esto suele ser útil al depurar aplicaciones. SQLNativeSql acepta una instrucción SQL y la devuelve después de que el controlador la haya modificado. Dado que esta función está en el nivel de compatibilidad de la interfaz principal, todos los controladores la admiten.