2016-06-07 77 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;