2012-12-17 39 views
10

Tôi đang cố chạy một truy vấn đơn giản để tìm các truy vấn có thời gian CPU trung bình cao nhất. Mã này được nghĩa đen copy-dán từ here:lỗi cú pháp trong CROSS ÁP DỤNG

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; 

Vấn đề là, SQL Server được phàn nàn về một lỗi cú pháp trong dòng 8 tại tham số để sys.dm_exec_sql_text: qs.sql_handle mà unhelpfully đọc

Incorrect syntax near '.'. 

tôi không thể , đối với cuộc sống của tôi, tìm ra những gì sai với truy vấn. Bất kỳ ý tưởng?

Trả lời

22

Nó có nghĩa là bạn là một trong hai

  1. không chạy SQL Server 2005; hoặc nhiều khả năng
  2. không chạy trong chế độ tương thích 90 hoặc cao hơn

Bạn có thể thay đổi nó đến 90 hoặc cao hơn sử dụng, nhưng nó có thể rất tốt phá vỡ rất nhiều các ứng dụng.

alter database MyDataBaseName set compatibility_level = 90 

Giải pháp đơn giản nhất trên SQL Server 2005 trở lên chỉ đơn giản là chạy từ "master" hoặc "tempdb", ví dụ:

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

Tôi hoàn toàn quên về mức độ tương thích! Tôi đang làm việc với SQL Server 2008 R2, nhưng mức độ tương thích được đặt thành 80 trên db cụ thể này (vì không có lý do chính đáng). – vlad

+2

câu trả lời này hoạt động, nhưng có thể thực hiện một truy vấn như thế này trong một thủ tục được lưu trữ không? Bởi vì bạn không thể sử dụng 'USE master;' trong một thủ tục được lưu trữ. – jtate

Các vấn đề liên quan