3

SQLテキストファイルを読み込んでSybaseASE12.51に送信する古いアプリケーションがあります。従来のアプリはDelphi5で作成されており、このプロセスにBDE TQueryコンポーネントを使用し、BDE SQLinksforSybaseを使用してSybaseにアクセスしています。

擬似コード:

SQLText=readSQLFile;
aTQuery.SQL.add(SQLText);
aTQuery.ExecSQL;

最近、DBアクセスレイヤーをDelphi XE ADO実装に移動しました。TADOQueryは、Sybaseが提供するADOプロバイダーを使用し、引き続き同じモデルを使用しています。

SQLText=readSQLFile;
aTADOQuery.SQL.add(SQLText)
aTADOQuery.ExecSQL;

ADOに移行した後、特定のデータが欠落していることがわかりました。このSQL構造の失敗を追跡しました。

Select myColumn from myTable 
Where  tranID = null

この構成はせいぜい意味的に疑わしいことを知っているので、このコードを見たときに「ダブルテイク」を実行しましたが、Sybase 12.5はそれを受け入れますが、ADOを使用すると、このセグメントは失敗します。

変更することにしました:

Where  tranID = null

Where  tranID is null

次に、欠落しているデータがロードされました。このセグメントと他のいくつかのセグメントについても、問題は解決されました。

誰かがこの振る舞いについて説明がありますか?BDEが通過したのに、ADOがこのシーケンスをインターセプトして拒否したのはなぜですか?

TIA

4

1 に答える 1

3

「NULL」には非常に特別な意味があり、SQLには特別な処理が必要です。値を「NULL」と比較することはできません。そのため、値をチェックするための特別な演算子IS(NOT)NULLがあります。徹底的な説明には多少のスペースが必要ですが、ここでは簡単な説明です。

「数学的な」観点から、NULLは「無限大」と考えることができます。2つの無限の値を簡単に比較することはできません。たとえば、整数と偶数のセットについて考えてみてください。どちらも無限ですが、前者の方が後者よりも大きいのは当然のようです。あなたが言うことができるのは、両方のセットが無限であるということだけです。

これは、たとえば1 + NULLがNULLを返す理由などを説明するのにも役立ちます(通常、SUM()などの集計関数のみがNULL値を無視できます-無視し、NULLをゼロに変換しないでください)。

一部のデータベースはNULLをどの値よりも小さいと見なし(ある種の-無限大であり、それによって最初に昇順で返す)、逆の場合もあるため、このメタファーはソートには当てはまらない場合があります。NULLを返す場所を設定するオプションがあるものもあります。

NULL演算とNULL比較については、データベースのドキュメントを確認してください。field = NULLは使用されるべきではなく、Sybaseがそれを受け入れるかどうかはわかりませんが、ほとんどのSQL実装は受け入れず、SQL標準に準拠していないと思います。IS(NOT)NULL構文に慣れる方がはるかに優れています。

更新:Sybaseには、ドキュメント(常にRTFM!)の「setansinull」オプションがあります。12.5.1では、「= NULL」構文を許可しないように拡張されました(SQL標準に準拠するためにONに設定されている場合)。OFFに設定すると、「=NULL」は「ISNULL」として機能します。

たぶん、SQLリンクまたはADOプロバイダーがそれをいずれかの値に設定します。

于 2011-12-12T22:51:43.090 に答える