Ошибка синтаксиса в 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_text: qs.sql_handle, которая бесполезно читает

Incorrect syntax near '.'.

Я не могу, по моей жизни, понять, что неправильно с запросом. Любые идеи?

Ответ 1

Это означает, что вы либо

  • не работает SQL Server 2005; или более вероятно
  • не работает в режиме совместимости 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;