2016-06-11 290 views
1

SQL Server 2016升級顧問報告數據庫兼容性問題: 規則:在90或更高版本的兼容模式下,ORDER BY子句中不允許使用常量表達式。SQL Server 2016升級顧問問題

Version90 規則標題:常量表達式未在ORDER允許BY子句中90或更高版本兼容模式

建議:在更改數據庫的兼容模式到90或更高版本,修改,在使用常量表達式語句ORDER BY子句使用列名稱或列別名或表示名稱或別名在選擇列表中的位置的非負整數。

規則ID:Microsoft.Rules.Data.Upgrade.UR00326

這是造成錯誤的SQL,我無法弄清楚如何改變Order By語句滿足升級顧問???

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [Utilities].[GetProcStats] (@order varchar(100) = 'use') 
AS 
BEGIN 
WITH GetQueryStats 
(plan_handle, 
    total_elapsed_time, 
    total_logical_reads, 
    total_logical_writes, 
    total_physical_reads) 
AS 
(SELECT qs.plan_handle, 
    SUM(qs.total_elapsed_time) AS total_elapsed_time, 
    SUM(qs.total_logical_reads) AS total_logical_reads, 
    SUM(qs.total_logical_writes) AS total_logical_writes, 
    SUM(qs.total_physical_reads) AS total_physical_reads 
    FROM sys.dm_exec_query_stats qs 
    GROUP BY qs.plan_handle) 
SELECT DB_NAME(st.dbid) AS database_name, 
     OBJECT_SCHEMA_NAME(st.objectid, st.dbid) AS schema_name, 
     OBJECT_NAME(st.objectid, st.dbid) AS proc_name, 
     SUM(cp.usecounts) AS use_counts, 
     SUM(cp.size_in_bytes) AS size_in_bytes, 
     SUM(qs.total_elapsed_time) AS total_elapsed_time, 
     CAST(SUM(qs.total_elapsed_time) AS decimal(38, 4))/SUM(cp.usecounts) AS avg_elapsed_time_per_use, 
     SUM(qs.total_logical_reads) AS total_logical_reads, 
     CAST(SUM(qs.total_logical_reads) AS decimal(38, 4))/SUM(cp.usecounts) AS avg_logical_reads_per_use, 
     SUM(qs.total_logical_writes) AS total_logical_writes, 
     CAST(SUM(qs.total_logical_writes) AS decimal(38, 4))/SUM(cp.usecounts) AS avg_logical_writes_per_use, 
     SUM(qs.total_physical_reads) AS total_physical_reads, 
     CAST(SUM(qs.total_physical_reads) AS decimal(38, 4))/SUM(cp.usecounts) AS avg_physical_reads_per_use, 
     st.text 
    FROM sys.dm_exec_cached_plans cp 
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st 
    INNER JOIN GetQueryStats qs ON cp.plan_handle = qs.plan_handle 
    INNER JOIN sys.procedures p ON st.objectid = p.object_id 
    WHERE p.type IN ('P', 'PC') 
    GROUP BY st.dbid, st.objectid, st.text 
    ORDER BY 
    CASE @order 
     WHEN 'name' THEN OBJECT_NAME(st.objectid) 
     WHEN 'size' THEN SUM(cp.size_in_bytes) 
     WHEN 'read' THEN SUM(qs.total_logical_reads) 
     WHEN 'write' THEN SUM(qs.total_logical_writes) 
    ELSE SUM(cp.usecounts) 
END DESC; 
END; 

我試着根據建議將ORDER BY更改爲以下內容。

ORDER BY CASE WHEN = @order '姓名' THEN OBJECT_NAME(st.objectid,st.dbid) WHEN @order = '尺寸' THEN SUM(cp.size_in_bytes) WHEN @order = '讀' THEN SUM(qs.total_logical_reads) WHEN @order ='write'THEN SUM(qs.total_logical_writes) ELSE SUM(cp.usecounts) END DESC;

但是,SQL Server 2016升級顧問仍報告相同的問題。

+0

我有同樣的問題也是如此。你有沒有設法解決這個問題? – f0rfun

回答

0

您不能在Order By子句中使用變量。

Sql Server 2008: Strange error in stored procedure

有一個可能的解決方案

+0

我嘗試將ORDER BY更改爲以下內容: –

+0

您可以刪除一些選項,這裏有很多可能出錯的地方。首先嚐試簡單的字段名稱。一旦這項工作加回總和(fieldname),最後加回到作爲標籤的schema_name中,而不是Object_Name(xxx) – Mike