ランタイム エンジンと SQL Server のバージョン (2008R2 から 2012) の最近の更新で、ODBC を介した大規模なクエリが空白のフィールドであってはならない場所に返されるという問題が発生し始めました。SQL Server で直接実行された同じクエリは正常に機能しました。
クエリからフィールドを削除し始めたところ、問題を引き起こしているのはクエリ内の 5 つの TEXT データ型フィールドであることがわかりました。SELECT ステートメントにリストされている最初の TEXT フィールドは問題なく表示され、後続の TEXT フィールドは表示されません。クエリから 2 つのフィールドを除くすべてを削除すると、残りの 2 つのフィールドが表示されます。
問題は明らかに ODBC 内で発生しているため、Windows 8 の odbc ドライバーを "SQL Server Native Client 11.0" から "SQL Server" に切り替えることを最初に考えました。これは役に立ちませんでした。
TEXT はサポートが終了しつつあるので、それが原因ではないかと思いました。すべての TEXT フィールドを NVARCHAR(MAX) に変換しました (ユニコードのサポートも探しています)。これは何も修正しませんでした。次に、ページ外データ型をページ内フォーマット NVARCHAR(4000) に変換してみました。これで問題は解決しましたが、4000 文字を超えるフィールドがいくつかあるため、全体的には機能しません。
私の質問:
- この問題を引き起こしているページ外データに関連する ODBC の制限は何ですか。私の理解では、 nvarchar(max) データは、十分に長い場合にのみページ外に保存されます (これについては間違っています)。私が使用しているサンプル テーブルでは、255 文字を超えるテキスト データ フィールドはありませんが、それでも問題は発生します。
- 余分な長さが必要なフィールドを特定し、それらのフィールドのみをページ外表現のままにしておくことができれば、おそらくうまくいくでしょう。ただし、アプリケーションのサイズにより、すべてのフィールド時間の正確な (および可能な) 使用を把握することは非常に困難です。この道に行かなくて済むことを願っています。