現在オフラインです。再接続するためにインターネットの接続を待っています

[FIX] バイナリに変換された列の結合が無効な結果になる

この記事は、以前は次の ID で公開されていました: JP282243
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
大文字小文字を区別しない照合順序を使用しているときに、binary 型または varbinary 型に変換された文字ベースの列で相関サブクエリまたは結合が実行され、オプティマイザが Table Spool を使用するプランまたはキャッシュを使った Hash Match を使用するプランを選択すると、正しくない結果が返されることがあります。返される行は、列の大文字小文字を区別しない比較に基づいて検索されたもので、バイナリの比較に基づいて検索されたものではありません。
原因
大文字小文字を区別しないサーバーでは、Table Spool またはHash キャッシュからの照合は、バイナリによる照合ではなく、大文字小文字の区別をしない照合が実行されます。列は binary 型にキャストされるので、バイナリによる照合を実行する必要があります。
解決方法
この問題を解決するために、SQL Server 2000 及び SQL Server 7.0 の最新の Service Pack の適用をお願いいたします。
最新の SQL Server サービスパックのダウンロードおよびインストールについて詳しくは以下をご覧下さい。

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


状況
弊社では、これを本資料の冒頭に記述した弊社製品の問題として確認しています。

SQL Server 2000

この問題は、Microsoft SQL Server version 2000 Service Pack 1 で修正されています。

SQL Server 7.0

この問題は、Microsoft SQL Server version 7.0 Service Pack 4 で修正されています。
詳細
以下のスクリプトは、この問題が発生する例を示しています。この修正を適用する前にスクリプトを実行すると、TestCode の値は、1 行目が "a"、2 行目が "A" という値ではなく、2 行とも "a" という値が返されます。
CREATE TABLE #tblIDs(TestID int, Code varchar(1))CREATE TABLE #tblValues(Code varchar(1))INSERT INTO #tblIDs(TestID, Code) VALUES(1,'a')INSERT INTO #tblIDs(TestID, Code) VALUES(2,'A')INSERT INTO #tblValues(Code) VALUES('a')INSERT INTO #tblValues(Code) VALUES('A')SELECT #tblValues.Code AS TestCode,    (SELECT #tblIDs.TestID FROM #tblIDs       WHERE CAST(#tblIDs.Code AS varbinary) =             CAST(#tblValues.Code AS varbinary)    ) AS TestID FROM #tblValuesDROP TABLE #tblIDsDROP TABLE #tblValuesGO
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 282243 (最終更新日 2002-04-25) をもとに作成したものです。

sort order convert conversion
プロパティ

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

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive _ik kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix kbsqlserv700bug KB282243
フィードバック