I want to write some queries which can work in almost all the databases without any SQLExceptions. So, where can I get the ANSI standards to write the queries ?
5 に答える
それがあなたを助けるかどうかわからない。
ベンダーは、標準の実装に関しては微妙なところがありますが、多くの場合、標準自体が不正確であるため、すべての実装者で機能するクエリを作成することはできません。
たとえば、SQL 92 では連結演算子を と定義して||
いますが、MySQL も MSSQL もこれを使用していません (Oracle は使用しています)。ベンダーに依存しない文字列連結は不可能です。
同様に、標準のエスケープ文字が指定されていないため、その処理方法がすべてのベンダーで機能するとは限りません。
そうは言っても:
SQL 92: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
SQL 99 ISO ドキュメントへのリンクを含む Wiki 記事: http://en.wikipedia.org/wiki/SQL:1999
ウィキペディアから:
SQL 標準は自由に入手できません。規格全体は、ISO/IEC 9075(1-4,9-11,13,14):2008 として ISO から購入できます。
ただし、SQL 標準 (SQL 99、2003 など) に厳密に従うデータベース エンジンはないため、この戦略に従うことはお勧めしません。それらはすべて、命令の処理方法や変数の定義方法に自由を取り入れています (たとえば、2 つの文字列を比較する場合、異なるエンジンでは大文字と小文字の区別が異なります)。あるエンジンでは非常に効率的な方法が、別のエンジンでは非常に効率が悪い場合があります。
クエリの標準グループを開発し、特定のターゲット RDBMS に対するそのクエリの特定の実装を含むさまざまなクラスを開発することをお勧めします。
これが役に立ったことを願っています
http://savage.net.au/SQL/で利用可能なコア SQL 文法の BNF を確認してください。
これは答えの一部です。あとは、Kiranu と MattMitchell が指摘しているように、ベンダーによって標準の実装方法が異なるということです。SQL-92 に完全に準拠している DBMS はありませんが、ほとんどの DBMS はかなり近いものです。
1 つの観察: SQL 標準はインデックスについて何も述べていないため、インデックスを作成するための標準構文はありません。また、データベースの作成方法についても何も述べていません。各ベンダーには、それを行うための独自のメカニズムがあります。
Sql -92 標準は、おそらくターゲットにしたいものです。主要な RDBMS のほとんどがサポートされていると思います。
これは簡潔なリンクです。サンプルコンテンツ:
- PostgreSQL にはビューがあります。ビューの更新を許可しないことで標準を破ります...
- DB2 少なくとも SQL-92 に準拠。
- MSSQL 少なくとも SQL-92 に準拠しています。
- MySQL 少なくとも SQL-92 に準拠しています。
- Oracle 少なくとも SQL-92 に準拠しています。
- Informix 少なくとも SQL-92 に準拠。
.NET を使用している場合は、System.Data.Common でファクトリ パターンを使用することも検討できます。これにより、多数の RDBMS のプロバイダー固有の抽象化がうまく機能します。
複数のデータベースに対して機能する製品を作成しようとしている場合、標準の「解釈」が異なるため、他の回答が示しているように、標準のSQLのみを使用しようとするのは適切ではないと思います。代わりに、可能であれば、データベースごとに異なる実装を持つアプリケーションに、ある種のデータ アクセス レイヤーを用意する必要があります。何をしようとしているのかによって、Hibernate などのツールがあり、これに関して多くの手間がかかります。