Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

syntax error in CROSS APPLY

I'm trying to run a simple query to find the queries with the highest average CPU time. The code is literally copy-pasted from here:

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 is, SQL Server is complaining about a syntax error in line 8 at the parameter to sys.dm_exec_sql_text: qs.sql_handle which unhelpfully reads

Incorrect syntax near '.'.

I cannot, for the life of me, figure out what's wrong with the query. Any ideas?

like image 697
vlad Avatar asked Dec 17 '12 21:12

vlad


People also ask

What is the cross apply in SQL?

The CROSS APPLY operator is semantically similar to INNER JOIN operator. It retrieves those records from the table valued function and the table being joined, where it finds matching rows between the two.

Does MySQL support cross apply?

The Cross Apply and Outer Apply features are not available in MySQL or PostgreSQL. A feature called Lateral Joins, which is similar, was introduced in MySQL 8.0.

What is difference between cross apply and outer apply in SQL?

Thus, the CROSS APPLY is similar to an INNER JOIN, or, more precisely, like a CROSS JOIN with a correlated sub-query with an implicit join condition of 1=1. The OUTER APPLY operator returns all the rows from the left table expression regardless of its match with the right table expression.


1 Answers

It means that you are either

  1. not running SQL Server 2005; or more likely
  2. not running in Compatibility mode 90 or above

You can change it to 90 or above using, but it could very well break a lot of applications.

alter database MyDataBaseName set compatibility_level = 90

The easiest solution on SQL Server 2005 and above is simply to run it from "master" or "tempdb", e.g.

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;
like image 142
RichardTheKiwi Avatar answered Oct 21 '22 16:10

RichardTheKiwi