2012-12-17 6 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はsys.dm_exec_sql_textにパラメータでの8行目に構文エラーについて不平を言っている:qs.sql_handle unhelpfully読み込み

Incorrect syntax near '.'. 

私はできません私の人生の間、質問に何が間違っているのかを理解してください。何か案は?

答えて

22

それはあなたがいずれかの

  1. は、SQL Server 2005を実行していないことを意味します。以上の可能性が高い
  2. は互換モード90でまたはあなたが90または使用上のそれを変更することができます

上で実行されているが、それ可能性は非常によくブレークのアプリケーションの多くは。ありません

alter database MyDataBaseName set compatibility_level = 90 

SQL Server 2005および上記の最も簡単な解決策は、例えば、「マスター」または「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

関連する問題