選擇 SQL 文法
建構 SQL 陳述式時,第一個要做出的決策便是所使用的文法。 除了如 Open Group、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 語句,並在驅動程式修改之後傳回它。 由於此函式屬於核心介面一致性層級,因此所有驅動程式都支援此函式。