FIX: A 參數化預存程序會傳回不正確的內部產生的 UNION 查詢

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:822033
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
當您在多處理器電腦上執行預存程序時,預存程序可能會傳回不正確的資料列或不正確的結果數目,如果下列情況成立:
  • 預存程序可以在平行執行的查詢。
  • 查詢建立衍生的資料表,並在資料表是一個 UNION 或 UNION ALL 的作業的結果。
  • 至少一個分支的 UNION 查詢使用參數值傳遞給程序,作為其 SELECT 清單中的常數運算式。
  • UNION 查詢所產生的衍生的資料表聯結與另一個使用傳回其中一個常數參數值傳遞至程序的資料行的資料表。
  • 查詢會使用依賴聯結資料行分割的雜湊聯結策略。

此查詢是語法的可能會導致發生行為的範例:
create procedure example_proc @P1 intasselect * from 				    ( select @P1 as x, ColB as y from T1          union all          select ColA as x, ColB as y from T2        ) as DerivedT Join T3     on DerivedT.x = T3.ColAgo
解決方案

服務套件資訊

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2000。如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
290211如何取得最新的 SQL Server 2000 Service Pack

Hotfix 資訊

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version         Size             File name   ---------------------------------------------------------------------------   31-May-2003  18:45  2000.80.818.0      78,400 bytes  Console.exe         25-Jun-2003  01:01  2000.80.818.0      33,340 bytes  Dbmslpcn.dll        25-Apr-2003  02:12                    786,432 bytes  Distmdl.ldf   25-Apr-2003  02:12                  2,359,296 bytes  Distmdl.mdf   30-Jan-2003  01:55                        180 bytes  Drop_repl_hotfix.sql   23-Jun-2003  22:40  2000.80.837.0   1,557,052 bytes  Dtsui.dll           23-Jun-2003  22:40  2000.80.837.0     639,552 bytes  Dtswiz.dll          24-Apr-2003  02:51                    747,927 bytes  Instdist.sql   03-May-2003  01:56                      1,581 bytes  Inst_repl_hotfix.sql   08-Feb-2003  06:40  2000.80.765.0      90,692 bytes  Msgprox.dll         01-Apr-2003  02:07                      1,873 bytes  Odsole.sql   05-Apr-2003  01:46  2000.80.800.0      62,024 bytes  Odsole70.dll        07-May-2003  20:41  2000.80.819.0      25,144 bytes  Opends60.dll       02-Apr-2003  21:48  2000.80.796.0      57,904 bytes  Osql.exe            02-Apr-2003  23:15  2000.80.797.0     279,104 bytes  Pfutil80.dll        22-May-2003  22:57                     19,195 bytes  Qfe469571.sql   11-Jul-2003  17:04                  1,084,147 bytes  Replmerg.sql    04-Apr-2003  21:53  2000.80.798.0     221,768 bytes  Replprov.dll        08-Feb-2003  06:40  2000.80.765.0     307,784 bytes  Replrec.dll         11-Jul-2003  16:56                  1,085,925 bytes  Replsys.sql   01-Jun-2003  01:01  2000.80.818.0     492,096 bytes  Semobj.dll          31-May-2003  18:27  2000.80.818.0     172,032 bytes  Semobj.rll   29-May-2003  00:29                    115,944 bytes  Sp3_serv_uni.sql   01-Jun-2003  01:01  2000.80.818.0   4,215,360 bytes  Sqldmo.dll          07-Apr-2003  17:44                     25,172 bytes  Sqldumper.exe       19-Mar-2003  18:20  2000.80.789.0      28,672 bytes  Sqlevn70.rll   02-Jul-2003  00:18  2000.80.834.0     180,736 bytes  Sqlmap70.dll        08-Feb-2003  06:40  2000.80.765.0      57,920 bytes  Sqlrepss.dll       10-Jul-2003  22:00  2000.80.840.0   7,553,105 bytes  Sqlservr.exe       08-Feb-2003  06:40  2000.80.765.0      45,644 bytes  Sqlvdi.dll         25-Jun-2003  01:01  2000.80.818.0      33,340 bytes  Ssmslpcn.dll        01-Jun-2003  01:01  2000.80.818.0      82,492 bytes  Ssnetlib.dll        01-Jun-2003  01:01  2000.80.818.0      25,148 bytes  Ssnmpn70.dll        01-Jun-2003  01:01  2000.80.818.0     158,240 bytes  Svrnetcn.dll        31-May-2003  18:59  2000.80.818.0      76,416 bytes  Svrnetcn.exe        30-Apr-2003  23:52  2000.80.816.0      45,132 bytes  Ums.dll             02-Jul-2003  00:19  2000.80.834.0      98,816 bytes  Xpweb70.dll      				
附註由於檔案相依性最新版 Hotfix 或包含檔案的功能也可能包含其他檔案。

其他可行方案
如果要解決此問題,使用任一下列方法:
  • 藉由新增 OPTION (MAXDOP 1) 查詢提示,停用查詢的查詢平行處理。這將會產生相同的結果為 Bug 修正。 Bug 修正會偵測是否 MAXDOP 選項設定為 1,並自動停用這種類型的查詢的平行處理。
  • 在本機變數中儲存預存程序的參數,並將本機變數當做參數傳遞到查詢。
  • 強制迴圈聯結或合併聯結等的不同的聯結策略。
狀況說明
Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 4 中獲得修正。
其他相關資訊
如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明

警告:本文為自動翻譯

內容

文章識別碼:822033 - 最後檢閱時間:02/27/2014 13:31:25 - 修訂: 8.2

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbqfe kbquery kbstoredproc kbsqlserv2000presp4fix kbfix kbbug KB822033 KbMtzh
意見反應