2012-12-17 68 views
10

我試圖運行一個簡單的查詢來查找具有最高平均CPU時間的查詢。該代碼是從字面上here複製粘貼:CROSS APPLY中的語法錯誤

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time], 
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
     ((CASE qs.statement_end_offset 
      WHEN -1 THEN DATALENGTH(st.text) 
     ELSE qs.statement_end_offset 
     END - qs.statement_start_offset)/2) + 1) AS statement_text 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st 
ORDER BY total_worker_time/execution_count DESC; 

問題是,SQL Server的抱怨在參數在第8行到語法錯誤到sys.dm_exec_sql_textqs.sql_handle它無助地讀取

Incorrect syntax near '.'. 

我不能,爲了我的生活,找出查詢有什麼問題。有任何想法嗎?

回答

22

這意味着你要麼

  1. 沒有運行SQL Server 2005;或者更可能
  2. 沒有在兼容模式下90或以上

你可以把它改成90或以上使用運行,但它可以很好突破了很多的應用。

alter database MyDataBaseName set compatibility_level = 90 

SQL Server 2005及以上版本的最簡單解決方案就是簡單地從「master」或「tempdb」運行它,例如,

USE tempdb; 
SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time], 
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
     ((CASE qs.statement_end_offset 
      WHEN -1 THEN DATALENGTH(st.text) 
     ELSE qs.statement_end_offset 
     END - qs.statement_start_offset)/2) + 1) AS statement_text 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st 
ORDER BY total_worker_time/execution_count DESC; 
+0

我完全忘記了兼容性級別!我正在使用SQL Server 2008 R2,但是在這個特定的數據庫上兼容級別設置爲80(沒有很好的理由)。 – vlad

+2

這個答案有效,但在存儲過程中可以執行這樣的查詢嗎?因爲你不能在存儲過程中使用'USE master;'。 – jtate