2016-06-11 7 views
1

SQL Server 2016 업그레이드 관리자가 데이터베이스 호환성 문제를보고합니다. 규칙 : 90 개 이상의 호환 모드에서 ORDER BY 절에 상수 식을 사용할 수 없습니다.SQL Server 2016 업그레이드 관리자 문제

Version90 규칙 제목 : 상수 표현식은 90 이상 호환성 모드에서 ORDER BY 절에서 허용

은 권장되지 않습니다 당신이 90 이상으로 데이터베이스 호환성 모드를 변경하기 전에에서 상수 표현식을 사용하여 문을 수정 열 이름 또는 열 별칭을 사용하는 ORDER BY 절 또는 선택 목록에서 이름 또는 별칭의 위치를 ​​나타내는 음이 아닌 정수

규칙 ID : Microsoft.Rules.Data.Upgrade.UR00326

이것은 오류를 일으키는 SQL 및 I 업그레이드 고문을 만족하는 문으로 순서를 변경하는 방법을 알아낼 수 없습니다 ???

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 CASE @order = '이름'THEN OBJECT_NAME (st.objectid, st.dbid)이 @order = '크기'THEN SUM (cp.size_in_bytes)이 @order =이 '읽을 BY THEN SUM (qs.total_logical_reads) WHERE @order = 'write'THEN SUM (qs.total_logical_writes) ELSE SUM (cp.usecounts) 끝 DESC;

그러나 SQL Server 2016 업그레이드 관리자는 여전히 동일한 문제를보고합니다.

+0

나뿐만 아니라 같은 데 문제가 있습니다. 이 문제를 해결할 수 있었습니까? – f0rfun

답변

0

더 이상 Order By 절에서 변수를 사용할 수 없습니다.

Sql Server 2008: Strange error in stored procedure

이 가능한 솔루션

+0

ORDER BY를 다음과 같이 변경해 보았습니다. –

+0

몇 가지 옵션을 제거 할 수 있습니까? 여기에 잘못 될 수있는 많은 것들이 있습니다. 먼저 간단한 필드 이름을 사용해보십시오. 그 작업이 합계 (fieldname)에 다시 추가되면 마침내 Object_name (xxx)이 아닌 label 인 schema_name에 다시 추가하십시오. – Mike