PRB: 執行計劃,並彙總串連查詢的結果視運算式的位置

文章翻譯 文章翻譯
文章編號: 287515 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當您將任何運算子或運算式套用至 ORDER BY 子句的彙總串連查詢時,您可能會遇到未預期的結果。在 Microsoft SQL Server 的彙總串連查詢的結果取決於將 Transact-SQL 運算式套用到查詢的 ORDER BY 子句中資料行。如需詳細資訊,或查看彙總串連查詢和固定行為的範例,請參考本文的 < 其他資訊 > 一節。

發生的原因

彙總串連查詢的正確的行為是未定義的。

查詢的顯示計劃輸出的檢查結果可顯示 SQL Server 查詢處理器在運算式套用至時查詢的 ORDER BY 子句中的資料行比將相同的運算式套用至查詢的 SELECT 清單中的資料行時,會建立不同的執行計劃。查詢處理器所做的決策是以可能的執行計劃的成本為基礎。

ANSI SQL-92 規格需要 ORDER BY 子句所參考任何資料行符合結果集資料行出現在 SELECT 清單中所定義。當運算式套用至 ORDER BY 子句的成員時,該結果的資料行就不會暴露在 SELECT 清單導致未定義的行為。

此外,ANSI 規格有關如何套用 ORDER BY 子句的狀態在 ORDER BY 的效果相同如如果應該採取整個結果集所產生的 SELECT 清單,然後執行 [排序依據 SELECT 清單中的這些資料行的資料表。

其他可行方案

若要達到預期的結果從彙總串連查詢,請在 SELECT 清單而不是在 ORDER BY 子句中的資料行套用任何 Transact-SQL 函式或運算式。

其他相關資訊

「 彙總串連查詢是將多個資料列的值結合成一列的查詢。

重製行為的步驟

使用下列的 Transact-SQL 指令碼來重現這個問題。

請注意 LTRIM 和 RTRIM 函式的應用程式,以在 SELECT 清單與 ORDER BY 子句中的 [C1] 資料行。
IF EXISTS( SELECT * FROM sysobjects WHERE name = 'T1' )
	DROP TABLE T1
GO

CREATE TABLE T1(  C1  NCHAR(1)  )

SET NOCOUNT ON

INSERT T1 VALUES( 'A' )
INSERT T1 VALUES( 'B' )

DECLARE @Str0 VARCHAR(4) 
DECLARE @Str1 VARCHAR(4) 
DECLARE @Str2 VARCHAR(4) 

SET @Str0 = ''
SET @Str1 = ''
SET @Str2 = ''

SELECT @Str0 = @Str0 + C1 FROM T1 ORDER BY C1
SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1

SELECT @Str0 'No functions applied to column.'
SELECT @Str1 'LTRIM() and RTRIM() applied to ORDER BY clause.'
SELECT @Str2 'SELECT list with LTRIM(RTRIM()) (Workaround)'

IF @Str1 <> @Str2
BEGIN
   PRINT ''
   PRINT 'Execution plan depends on where the functions are applied:'
   PRINT '=========================================================='
   PRINT ''

   SET @Str1 = ''
   SET @Str2 = ''

   SET STATISTICS PROFILE ON
   SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
   SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1
   SET STATISTICS PROFILE OFF
END

SET NOCOUNT OFF

DROP TABLE T1
				

屬性

文章編號: 287515 - 上次校閱: 2003年10月16日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
關鍵字:?
kbmt kbcodesnippet kbprb KB287515 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:287515
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com