0

このアプリケーションでは、ユーザーはSQLコードを入力して、NexusDBデータベースからデータを取得できます。実際にクエリを実行せずに、そのようなクエリの結果のメタデータを決定したいと思います。メタデータを使用して、フィールドの数と結果の各フィールドのデータ型を決定します。

[追加]この機能は、ユーザー定義の変換プロセスの一部として使用します。実際の変換は後でバッチのようなプロセスで行われますが、事前にメタデータが必要なので、ユーザーは変換で追加のフィールド特性やプラグインの適用、親子関係の作成などの変更を指定できます。[/ addition ]

これまでは、基本的WHERE FALSEにSQLクエリに追加するか、既存のすべてのWHEREステートメントを。に置き換えることでこれを実行していましたWHERE FALSE AND。ただし、もちろん、SQL全体を解析して、コメント、ネストされたSELECTS、JOIN、およびその他の句を考慮に入れて、調整する正しいwhere句の正確な場所を決定する必要があります。このようにかなり複雑になります:-(

また、これのもう1つの欠点は、結果セットが空になることを事前に知っていても、ほとんどの場合、クエリの実行に長い時間がかかる可能性があることです。

これを達成する別の方法があるかどうか疑問に思いました。

つまり、TQueryオブジェクトには独自のパーサーが必要であり、SQLステートメントをさまざまな句に分割します。実行の直前にwhere句を変更できれば、自分で解析を行う必要はありません。しかし、TQueryオブジェクトの内部に飛び込むのは少し心配です。ただ、私たちが望むようにそれを使用する方法がないことを知るためです。

誰かがこれについて何かアドバイスがありますか?

4

3 に答える 3

3

既に行っていることの変形は、where 句を変更する代わりに、元の SQL ステートメントをネストされた select に入れることです。複雑なクエリの場合select * from MyTableは、このように埋め込んで結果を取得できません。

select *
from
(
  select *
  from MyTable
) as xx
where 0=1

NexusDBではなく、SQL Serverでのみこれをテストしました

于 2011-03-14T10:55:04.453 に答える
1

クライアント側の TnxQuery コンポーネントに飛び込んでも役に立ちません。これは、ステートメントとカーソル ハンドルの単なるラッパーです。クライアント側で必要なメタデータを取得する唯一の方法は、カーソル ハンドルから取得することです。カーソル ハンドルは、クエリの実行時にのみ生成されます。

今のところ、クエリの実行時に実行される作業を最小限に抑える唯一の方法は、既に行っていることです。

イシュー トラッカー ( http://www.nexusdb.com/mantis/view_all_bug_page.php ) で機能リクエストを提出すると、必要なく「データを処理しない」ようにエンジンに指示するフラグを指定する可能性を調査できます。クエリ自体をいじるの。

于 2011-03-14T11:43:07.853 に答える
0

TDatasetProvider を持つ TClientDataset を元の TQuery (または任意の TDataset の子孫) にリンクすることもできます。次に、TClientDataset の PacketRecords プロパティを 0 に設定して開きます。データなしで TClientDataSet のフィールドを取得します。

于 2011-03-14T16:36:32.107 に答える