質問
DBMSベンダーの使用のSQL方言の特徴の差別化商品と同時に正確ではないことにご注意願支援SQLます。Pontaポイント利用可能。
はありませ例SQLインジェクションの使い分けることができなように変換されSQL:2008のスタンダードSQL?
具体的には、いDML(クエリー計算書)DDL-保存の手順書式または何もしない純粋なSQLます。
私はもうクエリを使うのは、生産しないアドホック。
編集Jan13
全体的にお答え:彼らが伝えられている印象を多くのDBMS固有のSQLを作成するワーク-arounds貧困の関係のデザイン。この結果かも知れません。ん したい ポートもに、既存アプリケーション.
解決
典型的な違いは微妙differntセマンティクス(例えば、Oracleはいくつかのケースで異なる他のSQLの方言からNULLを扱う)、別の例外処理の仕組み、異なるタイプおよび文字列操作、日付操作や階層問合せのようなものを行うための独自の方法が挙げられます。クエリヒントはまた、プラットフォーム間で異なる構文を持っている傾向があり、異なるoptimisersは、構造の異なる種類に混乱してしまうことがあります。
一つは、データベースシステム間で大部分はANSI SQLを使用して、不足しているインデックスのような有意なチューニングの問題にデータベース上で、合理的な結果を得ることを期待することができます。しかし、任意の非自明なアプリケーションに簡単に移植性に行うことができないコードのためのいくつかの要件がありそうです。
これは問題を引き起こすクエリの一握り -一般的に、この要件はかなりアプリケーションコードベース内に局在化されるであろう。報告は、はるかにこの種の問題を投げる可能性があり、データベース管理者間で動作する汎用的なレポーティングクエリを実行すると、うまくいくことは非常に考えにくいです。一部のアプリケーションでは、他よりも悲しみを引き起こす可能性が高くなります。
そのため、アプリケーションのための「ポータブル」SQL構文に頼ることは一般的なケースでは動作することはほとんどありません。より良い戦略は、彼らが働くと、これは動作しませんデータベースの特定の層に抜け出すだろう一般的な文を使用することです。
一般的なクエリメカニズムは、可能な限りANSI SQLを使用することができ、別の可能なアプローチは、種々のデータベース・プラットフォーム用のドライバを取ることができるO / Rマッパーを使用することであろう。このタイプの機構は、データベース操作の大半を十分ですが、それは蒸気を使い果たしたいくつかのプラットフォームspecifc仕事をするためにあなたを必要とします。
あなたは、より複雑な操作のための抽象化層としてストアドプロシージャを使用して、各ターゲットプラットフォームのプラットフォーム固有のストアドプロシージャのセットを符号化することができるかもしれません。ストアドプロシージャは、ADO.netのようなものを介してアクセスすることができます。
実際には、PARAMTER通過し、例外処理の微妙な違いは、このアプローチで問題が発生することがあります。より良いアプローチは、ラップモジュールを製造することです 共通インタフェースとプラットフォーム固有のデータベース操作。異なる「ドライバのモジュールは、あなたが使用しているDBMSのプラットフォームに依存にスワップアウトすることができます。
他のヒント
Oracleは、このようななど、いくつかの追加を、持っていますモデルのか、階層非常に困難、不可能ではないですクエリ、純粋なSQLに変換する
SQLた場合でも:2008は時々構文は同じではありません何かを行うことができます。例えば、SQLをREGEXPマッチング構文を取る:2008は、MySQLのLIKE_REGEX
対REGEXP
を使用しています。
そして、はい、私は同意、それは非常に迷惑なんだ。
オラクルとの問題の一部は、それがまだSQL 1992 ANSI標準に基づいているということです。 SQL Serverは、SQL 1999標準であるので、「拡張子」のように見えるもののいくつかは、実際の新しい規格です。 (私は「OVER」節はこれらの一つであると考えています。)
また、Oracleには、はるかに多くの制限SQLにサブクエリを置くことについてです。 SQL Serverは、ほとんどどこでもサブクエリを許可についてはるかに柔軟かつ寛容である。
SQL Serverは、結果の「トップ」の行を選択するための合理的な方法があります:「SALES_TOTALすることにより、お客様の注文からTOP 1を選択します」。オラクルでは、これは "(SALES_TOTALすることにより、お客様の注文をSELECT)SELECT * FROM WHERE ROW_NUMBER <= 1" になります。
そして、もちろんあります常にDUAL FROM Oracleの悪名高いSELECT(表現)。
編集を追加します:
今、私が仕事でだと私の例のいくつかにアクセスできることを、ここでは良いものです。これは、LINQツーSQLによって生成されるが、それはソートした後、テーブルから50を介して行41を選択するために、きれいなクエリです。これは、 "OVER" 句を使用します:
SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactTitle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[Phone], [t1].[Fax]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ContactName]) AS [ROW_NUMBER], [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 40 + 1 AND 40 + 10
ORDER BY [t1].[ROW_NUMBER]