选择 SQL 语法

构造 SQL 语句时,要做出的第一个决定就是使用哪个语法。 除了开放组、ANSI 和 ISO 等各种标准机构提供的语法外,几乎每个 DBMS 供应商都定义了自己的语法,每个语法与标准略有不同。

附录 C:SQL 语法说明了所有 ODBC 驱动程序都必须支持的最低 SQL 语法。 此语法是 SQL-92 入门级别的子集。 驱动程序可能支持其他语法,以符合 SQL-92 定义的中间级别、完整级别或 FIPS 127-2 过渡级别。 有关详细信息,请参阅“附录 C:SQL 语法”中的 SQL 最低语法以及 SQL-92。

附录 C 还定义了转义序列,其中包含 SQL-92 语法未涵盖的常用语言功能(如外部联接)的标准语法。 有关详细信息,请参阅本部分后面的“附录 C:SQL 语法”中的 ODBC 转义序列转义序列

所选语法会影响驱动程序处理语句的方式。 驱动程序必须将 SQL-92 SQL 和 ODBC 定义的转义序列修改为特定于 DBMS 的 SQL。 由于大多数 SQL 语法基于一项或多项不同的标准,因此大多数驱动程序几乎不需要或完全不需要执行任何工作,即可满足此要求。 驱动程序通常只搜索 ODBC 定义的转义序列,并将其替换为特定于 DBMS 的语法。 当驱动程序遇到无法识别的语法时,会假定该语法特定于 DBMS,并将 SQL 语句传递给数据源以执行,而无需进行修改。

因此,实际上有两种语法选择:SQL-92 语法(和 ODBC 转义序列)和特定于 DBMS 的语法。 在这两种语法中,只有 SQL-92 语法可互操作,因此所有可互操作的应用程序都应使用该语法。 不可互操作的应用程序可以使用 SQL-92 语法或特定于 DBMS 的语法。 特定于 DBMS 的语法有两个优点:可以利用 SQL-92 未涵盖的任何功能,并且速度稍快一些,因为驱动程序不必修改这些语法。 可以通过设置 SQL_ATTR_NOSCAN 语句属性来部分强制实施后一种功能,这会阻止驱动程序搜索和替换转义序列。

如果使用 SQL-92 语法,应用程序可以通过调用 SQLNativeSql 来发现驱动程序如何对其进行修改。 在调试应用程序时通常很有用。 SQLNativeSql 接受 SQL 语句,并在驱动程序进行修改后返回该语句。 由于此函数处于核心接口一致性级别,因此所有驱动程序都支持此函数。