2012-12-17 10 views
10

Próbuję uruchomić proste zapytanie, aby znaleźć zapytania o najwyższym średnim czasie pracy procesora. Kod jest dosłownie kopia wklejony od here:błąd składniowy w 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; 

Problem jest, SQL Server narzeka błąd składni w linii 8 w parametrze do sys.dm_exec_sql_text: qs.sql_handle który unhelpfully czyta

Incorrect syntax near '.'. 

nie mogę , dla mojego życia, dowiedz się, co jest nie tak z zapytaniem. Jakieś pomysły?

Odpowiedz

22

Oznacza to, że albo jesteś

  1. nie działa SQL Server 2005; lub bardziej prawdopodobne
  2. nie działa w trybie zgodności 90 lub powyżej

Można go zmienić na 90 lub wyżej, stosując, ale mógłby równie dobrze przerwa wiele zastosowań.

alter database MyDataBaseName set compatibility_level = 90 

Najprostszym rozwiązaniem na SQL Server 2005 i powyżej jest po prostu uruchomić go z „master” lub „”, np 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

Całkowicie zapomniałem o poziomach kompatybilności! Pracuję z SQL Server 2008 R2, ale poziom kompatybilności jest ustawiony na 80 na tym konkretnym db (bez ważnego powodu). – vlad

+2

ta odpowiedź działa, ale czy można wykonać takie zapytanie w procedurze przechowywanej? Ponieważ nie można użyć 'USE master;' w procedurze przechowywanej. – jtate

Powiązane problemy