[FIX] サーバー側のカーソルが間違った結果を返す

この記事は、以前は次の ID で公開されていました: JP286788
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
次の条件がすべて該当する場合に、サーバー側の動的なカーソルまたはキーセット ドリブン カーソルが間違った結果を返すことがあります。
  • クエリでサブ SELECT ステートメントが列リストとして使用される場合
  • サブ SELECT で COUNT(*) 関数が使用される場合
  • サブ SELECT に条件付きの ANSI 結合がある場合
  • 外部 FROM 句テーブルにサブ SELECT との Transact-SQL 結合がある場合
解決方法

SQL Server 2000

この問題を解決するために、SQL Server 2000 の最新の Service Pack の適用をお願いいたします。
最新の SQL Server サービスパックのダウンロードおよびインストールについて詳しくは以下をご覧下さい。

http://www.microsoft.com/japan/sql/download/default.asp (日本語版)
http://www.microsoft.com/sql/downloads/default.htm(英語版)

SQL Server 7.0

下記のいずれかの手段によりこの問題は回避可能です。
  • 静的カーソルを使用します。

  • クライアント側のカーソルを使用します。

  • ANSI 結合の条件を WHERE 句に移動します (「詳細」を参照してください)。
状況
弊社では、これを Microsoft SQL Server version 2000 及び 7.0 の問題として確認しています。
この問題は、Microsoft SQL Server version 2000 Service Pack 1 で修正されています。
詳細
以下のコードにより現象の再現が可能です。
CREATE TABLE  TABLE1( T1COL1 int NOT NULL PRIMARY KEY)goCREATE TABLE  TABLE2( T2COL1 int NOT NULL PRIMARY KEY, T2COL2 int NOT NULL )goCREATE TABLE TABLE3(	T3COL1 int NOT NULL)goInsert into TABLE1(T1COL1) values(4)Insert into TABLE1(T1COL1) values(3)Insert into TABLE2(T2COL1, T2COL2) values(5, 3)Insert into TABLE2(T2COL1, T2COL2) values(6, 4)Insert into TABLE3(T3COL1) values(6)go-------------- 再現用スクリプト (正しい結果は 0 と 1 です) -------------declare test cursor keyset for Select (select count(*)      from dbo.TABLE2 as T2 join dbo.TABLE3 as T3 on T3.T3COL1 = T2.T2COL1      where T2.T2COL2 = T1.T1COL1) as Para from dbo.TABLE1 as T1open testfetch testfetch testdeallocate test--------------- 回避策 (結合条件を WHERE 句に移動します) ----------------declare test cursor keyset local for Select (select count(*)      from dbo.TABLE2 as T2, dbo.TABLE3 as T3       where T2.T2COL2 = T1.T1COL1 and T3.T3COL1 = T2.T2COL1) as Para       from dbo.TABLE1 as T1open testfetch testfetch testdeallocate test
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 286788 (最終更新日 2001-08-17) をもとに作成したものです。

SSrvTran_SQL
プロパティ

文書番号:286788 - 最終更新日: 01/16/2015 21:31:32 - リビジョン: 2.1

  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • kbnosurvey kbarchive kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix kbsqlserv700bug KB286788
フィードバック