2012-12-17 10 views
10

Sto tentando di eseguire una query semplice per trovare le query con il tempo medio della CPU più elevato. Il codice è letteralmente la copia-incollato da here:Errore di sintassi in 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; 

Il problema è che SQL Server si lamenta un errore di sintassi nella linea 8 al parametro da sys.dm_exec_sql_text: qs.sql_handle che legge inutilmente

Incorrect syntax near '.'. 

non posso , per la vita di me, scopri cosa c'è di sbagliato nella query. Qualche idea?

risposta

22

Significa che si sono o

  1. non è in esecuzione SQL Server 2005; o più probabilmente
  2. non è in esecuzione in modalità di compatibilità 90 o superiore

È possibile modificarlo a 90 o superiore utilizzando, ma potrebbe benissimo pausa un sacco di applicazioni.

alter database MyDataBaseName set compatibility_level = 90 

La soluzione più semplice su SQL Server 2005 e, soprattutto, è semplicemente quello di lanciarlo da "master" o "tempdb", ad esempio,

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

Mi sono completamente dimenticato dei livelli di compatibilità! Sto lavorando con SQL Server 2008 R2, ma il livello di compatibilità è impostato su 80 su questo particolare db (per nessuna buona ragione). – vlad

+2

questa risposta funziona, ma è possibile eseguire una query come questa in una stored procedure? Perché non puoi usare il comando 'USE master;' in una stored procedure. – jtate