徵狀
在執行 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 網頁: