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と私はアップグレードアドバイザーを満たすために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を提案に基づいて以下に変更しようとしました。

CASE BY ORDER @order = 'name' のTHEN OBJECT_NAME(st.objectid、st.dbid) @order = 'サイズ' THEN SUM(cp.size_in_bytes) @orderは= '読み取り' THEN SUM(qs.total_logical_reads) WHERE @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

あなたのオプションのいくつかを削除できますか?ここで間違っていることがたくさんあります。まず簡単なフィールド名を試してください。これが動作したら、最後にObjectName(xxx)ではなく、ラベルであるschema_nameに最後に追加します。 – Mike