徵狀

在執行 Microsoft SQL Server 2008 的電腦上,請考慮使用下列案例。

案例 1

您可以使用 WITH 語句來指定通用資料表運算式(CTE)。 例如,您執行下列查詢。

WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)

然後,執行此查詢。

SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1

在這種情況下,此查詢的快取查詢方案會儲存不正確的 statement_start_offset 與 statement_end_offset 值。 具體來說,您會注意到 statement_end_offset 值小於執行 sys.dm_exec_query_stats 動態管理檢視(DMV)時的 statement_start_offset 值。由於這個問題,當報表假設 statement_start_offset 值必須小於 statement_stop_offset 值時,效能報告可能會失敗。

案例 2

您可以使用 WITH 語句來指定通用資料表運算式,並使用重新編譯選項。 例如,您可以使用下列腳本在 SQL Server 2008 中建立函數。

CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND

當您執行 [select dbo. function1 ()] 查詢時,您會收到下列錯誤訊息:

目前的命令發生嚴重錯誤。 結果(如果有的話)應該捨棄。

此外,如果 SQL server 遇到大量的伺服器流量,則不需要重新編譯選項,也可能會發生此錯誤。

狀況 3

您可以使用 WITH 語句來指定通用資料表運算式。 在 WITH 語句中,您指定的資料表不存在。 例如,您執行下列查詢。

WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

當您執行此查詢時,就不會收到遺失的資料表的錯誤。

原因

發生這些問題的原因是,處理 WITH 語句後的 SELECT 語句無法正常作業。 WITH 語句使用下列語法。

WITH common_table_expression AS(CTE_query_definition)

這個語句接著會建立指派給指定之通用資料表運算式名稱的結果集。 接著,請在此語句中使用 SELECT 語句。 如果第二個語句是括在括弧內,而您嘗試執行 sys.dm_exec_query_stats 的動態管理檢視,您會收到不正確的結果或錯誤。

解決方案

Service pack 資訊 若要解決此問題,請取得最新的 SQL Server 2008 service pack。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

968382 如何取得最新的 SQL Server service pack 2008

因應措施

若要解決這些問題,您必須移除 [通用資料表] 運算式後面的語句中的括弧。 例如,請考慮下列語句,使用此類括弧。

WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)

若要解決這些問題,請改成下列語句,不使用這些括弧。

WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

狀態

Microsoft 已確認這是「適用于」區段中所列之 Microsoft 產品中的問題。這個問題首先是在 SQL Server 2008 Service Pack 2 (SP2)中修正。

其他相關資訊

如需有關如何將 WITH 語句與通用資料表運算式搭配使用的詳細資訊,請造訪以下 MSDN 網頁:

使用 common_table_expression (Transact-sql)如需 sys.dm_exec_query_stats 的詳細資訊,請造訪以下 MSDN 網頁:

sys.dm_exec_query_stats (Transact-sql)

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×