CROSS APPLY中的语法错误

vla*_*lad 12 t-sql sql-server dmv

我正在尝试运行一个简单的查询来查找具有最高平均CPU时间的查询.该代码是从字面上复制粘贴在这里:

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;
Run Code Online (Sandbox Code Playgroud)

问题是,SQL Server抱怨第8行的语法错误,参数为sys.dm_exec_sql_text:qs.sql_handle无效读取

Incorrect syntax near '.'.
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我不能弄清楚查询有什么问题.有任何想法吗?

Ric*_*iwi 25

这意味着你要么

  1. 没有运行SQL Server 2005; 或者更有可能
  2. 未在兼容模式90或更高版本中运行

您可以使用它将其更改为90或更高,但它很可能会破坏很多应用程序.

alter database MyDataBaseName set compatibility_level = 90
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有效,但是可以在存储过程中执行这样的查询吗?因为你不能在存储过程中使用`USE master;`. (2认同)