Remyの回答は、単一のクエリとして再定式化される場合があります。一度準備してから、何度も再度開くとよいでしょう。
select * from clients where (clientid = :clientid)
and (:clientid is not null)
UNION ALL
select * from clients where (:clientid is null)
これは、2つの異なるクエリ(同じ結果ベクトルを持つ)を一緒に集約するだけです。そして、状態はそれらの1つをオフにするだけです。使用は次のようになります。
DBComp.Prepare.
...
DBComp.Close;
DBComp.ParamByName('clientid').Value := clientid;
DBComp.Open;
...
DBComp.Close;
DBComp.ParamByName('clientid').Clear;
DBComp.Open;
ただし、このクエリはSQL Serverオプティマイザー機能に依存して、クエリ不変条件を抽出し(:clientidは[not] null)、クエリを完全に有効/無効にします。しかし、まあ、あなたの元のクエリもそれに依存しています。
なぜまだ時代遅れのFB1.5を使用するのですか?FB 2.5.2はそこでうまく機能しませんか?あなたの元のクエリはうまく定式化されていないと思います。
select * from clients where (:clientid = -1) or ((clientid = :clientid) and (:clientid <> -1))
SQLServerオプティマイザの方がおそらく簡単でしょう。それでも、FBはそこでより良い仕事をすることができると思います。後でFBをダウンロードして、IBExpertやFlameRobinなどのIDEを使用してクエリを実行してみてください。括弧を再配置し、-1をNULLに変更することは、試してみるべき明らかなアイデアです。
現在、BDEの使用は脆弱です。それほど高速ではなく、データ型と接続性が制限されます(たとえば、FB / IBイベントはありません)。そして、Vista/Win7とWin64とのあらゆる種類の互換性の問題があります。FB / IBを選択するサーバーの場合は、最新のコンポーネントセットに切り替えることを検討してください。
また、テーブルとインデックスの定義とそれらのインデックスの選択性を示すのも良いことです。