2016-06-07 72 views
0

以下查詢在SQL Server 2008中運行,但它在SQL Server 2012中不起作用。爲什麼?發現問題查詢

SELECT TOP 20 
    total_worker_time/execution_count AS Avg_CPU_Time, 
    Execution_count, 
    total_elapsed_time/execution_count AS AVG_Run_Time, 
    total_elapsed_time, 
    (SELECT 
     SUBSTRING(text, statement_start_offset/2 + 1, statement_end_offset) 
    FROM sys.dm_exec_sql_text(sql_handle)) 
    AS Query_Text 
FROM sys.dm_exec_query_stats 
ORDER BY Avg_CPU_Time DESC 
+1

必須拋出一些error.you可以打破查詢分成幾個部分,並檢查哪些特定的查詢不working.May是新服務器中的權限問題。 – KumarHarsh

+1

你正在觀察的錯誤/問題是什麼? – TheGameiswar

+0

您不能通過'Avg_CPU_Time'進行排序,因爲它是計算值的別名,請使用'ORDER BY 1 DESC'而不是 – CeOnSql

回答

0

CASE應該給你一些光。

SELECT TOP 20 
    total_worker_time/execution_count AS Avg_CPU_Time, 
    Execution_count, 
    total_elapsed_time/execution_count AS AVG_Run_Time, 
    total_elapsed_time, 
    (SELECT 
     SUBSTRING(text, statement_start_offset/2 + 1, 
     ((CASE WHEN statement_end_offset = -1 
     THEN (LEN(CONVERT(nvarchar(max),text)) * 2) 
     ELSE statement_end_offset END) - statement_start_offset)/2+1) 
    FROM sys.dm_exec_sql_text(sql_handle)) 
    AS Query_Text 
FROM sys.dm_exec_query_stats 
ORDER BY Avg_CPU_Time DESC 
-1

正如我在一個commet中提到的,order by子句不起作用。請儘量APPLY功能sys.dm_exec_sql_text

SELECT TOP 20 
     s.total_worker_time/execution_count AS Avg_CPU_Time, 
     s.execution_count, 
     s.total_elapsed_time/s.execution_count AS AVG_Run_Time, 
     s.total_elapsed_time, 
     SUBSTRING(t.text, s.statement_start_offset/2 + 1, s.statement_end_offset) 
FROM sys.dm_exec_query_stats s 
     OUTER APPLY sys.dm_exec_sql_text(sql_handle) t 
ORDER BY 1 DESC 

請向我們提供了一些錯誤的文字,也許有SUBSTRING函數內不對勁......

+1

[_order_by_expression_](https://msdn.microsoft.com/zh-cn/library/ms188385%28v=sql.110%29.aspx ) 指定對查詢結果集進行排序的列或表達式。可以將排序列指定爲名稱或列別名**,也可以指定表示列表在選擇列表中的列位置的非負整數。 – qxg

+0

再一次,不在SQL Server 2012中 – CeOnSql

1

statement_end_offset意味着statement_end_offset是字符數到目前執行當前正在執行的語句結束的批處理或存儲過程。

問題:statement_end_offset返回-1值有時會出現錯誤:「傳遞給LEFT或SUBSTRING函數的長度參數無效」。

使用以下修改後的查詢將在任何SQL Server版本的工作: -

SELECT TOP 20 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 Query_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;