2016-06-11 11 views
1

SQL Server 2016 Upgrade Advisor meldet ein Datenbankkompatibilitätsproblem: Regel: konstante Ausdrücke sind in der ORDER BY-Klausel in 90 oder höheren Kompatibilitätsmodi nicht zulässig.SQL Server 2016 Upgrade Advisor Problem

Version90 Regel Titel: Konstante Ausdrücke sind nicht

Empfehlung in der ORDER BY-Klausel in 90 oder höher Kompatibilitätsmodus erlaubt: Bevor Sie die Datenbank-Kompatibilitätsmodus auf 90 oder höher Anweisungen ändern, modifizieren, die in konstanten Ausdrücken verwenden die ORDER BY-Klausel, um einen Spaltennamen oder Spaltenalias oder eine nicht negative Ganzzahl zu verwenden, die die Position des Namens oder Alias ​​in der Auswahlliste darstellt.

Regel-ID: Microsoft.Rules.Data.Upgrade.UR00326

Dies ist der SQL, die den Fehler verursacht, und ich kann nicht herausfinden, wie die Sortierung nach Anweisung ändern, um die Upgrade-Berater zu befriedigen ???

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; 

Ich versuchte, die ORDER BY basierend auf dem Vorschlag zu ändern.

ORDER BY CASE WHEN 'name' @order = THEN OBJECT_NAME (st.objectid, st.dbid) WHEN @order = 'size' THEN SUM (cp.size_in_bytes) WHEN @order = 'lesen' THEN SUM (qs.total_logical_reads) WENN @order = 'schreiben' THEN SUM (qs.total_logical_writes) SONST SUM (cp.usecounts) END DESC;

Aber der SQL Server 2016 Upgrade Advisor meldet immer noch das gleiche Problem.

+0

ich auch das gleiche Problem. Hast du es geschafft, das zu lösen? – f0rfun

Antwort

0

Sie können keine Variable mehr in der Order By-Klausel verwenden.

Sql Server 2008: Strange error in stored procedure

hat eine mögliche Lösung

+0

Ich habe versucht, die ORDER BY zu ändern: –

+0

Können Sie einige Ihrer Optionen entfernen, gibt es viele Dinge, die hier schief gehen könnten. Versuchen Sie es zunächst mit einfachen Feldnamen. Sobald das funktioniert, addiere dich zurück in die Summe (Feldname), und füge schließlich zurück in Schema_Name, der die Bezeichnung ist, und nicht den Object_Name (xxx) – Mike