在 SQL Server 2012 中编写的查询与 SQL Server 2016 的兼容性

JOJ*_*OJI 2 sql-server

为 SQL Server 2012 设计和编写的查询能否在 SQL Server 2016 上按原样使用。我们计划升级 SQL Server,并希望尽量减少人工干预以过渡我们的工作

Han*_*non 9

SQL Server 始终向后兼容,但不推荐使用的功能列表中列出的项目除外。

查询优化器的更改可能会导致性能提高,并且在某些情况下会降低性能。

Microsoft 的数据迁移助手提供了一种查找数据库正在使用的已弃用功能的方法。

数据迁移助手可帮助发现可能影响升级到本地 SQL Server 的问题。这些被描述为兼容性问题,并分为以下几类:

  • 重大变化
  • 行为改变
  • 已弃用的功能

Microsoft 还提供了此数据库引擎功能重大更改的列表。

确保首先在非生产环境中测试升级。

以下脚本可用于创建两个扩展事件会话,记录已弃用功能和最终支持功能的使用情况:

IF EXISTS (
    SELECT 1 
    FROM sys.dm_xe_sessions xes 
    WHERE xes.name = 'DeprecationFinalSupportEvents'
    )
BEGIN
    ALTER EVENT SESSION DeprecationFinalSupportEvents ON SERVER STATE = STOP;
    DROP EVENT SESSION DeprecationFinalSupportEvents ON SERVER;
END
IF EXISTS (
    SELECT 1 
    FROM sys.dm_xe_sessions xes 
    WHERE xes.name = 'DeprecationAnnouncmentEvents'
    )
BEGIN
    ALTER EVENT SESSION DeprecationAnnouncmentEvents ON SERVER STATE = STOP;
    DROP EVENT SESSION DeprecationAnnouncmentEvents ON SERVER;
END
GO

DECLARE @LogPath VARCHAR(260);
DECLARE @FinalSupportPathETL VARCHAR(260);
DECLARE @FinalSupportPathMTA VARCHAR(260);
DECLARE @DepPathETL VARCHAR(260);
DECLARE @DepPathMTA VARCHAR(260);

SELECT @LogPath = REVERSE(SUBSTRING(REVERSE(path)
    , CHARINDEX('\', REVERSE(path)) + 1, LEN(path) - CHARINDEX('\', REVERSE(path)) + 1))
FROM sys.traces;

SET @FinalSupportPathETL = @LogPath + '\DeprecationFinalSupportEvents.etl';
SET @FinalSupportPathMTA = @LogPath + '\DeprecationFinalSupportEvents.mta';
SET @DepPathETL = @LogPath + 'DeprecationAnnouncmentEvents.etl';
SET @DepPathMTA = @LogPath + 'DeprecationAnnouncmentEvents.mta';

DECLARE @cmd NVARCHAR(MAX);

SET @cmd = '
CREATE EVENT SESSION DeprecationFinalSupportEvents ON SERVER
ADD EVENT sqlserver.deprecation_final_support (
    ACTION  (
        sqlserver.database_id
        , sqlserver.sql_text
        , sqlserver.session_id
        , sqlserver.tsql_stack
    )
)
ADD TARGET package0.asynchronous_file_target (
    SET FILENAME = ''' + @FinalSupportPathETL + '''
        , METADATAFILE = ''' + @FinalSupportPathMTA + '''
);

ALTER EVENT SESSION DeprecationFinalSupportEvents ON SERVER
STATE = START;
';
PRINT @cmd;
EXEC (@cmd);

SET @cmd = '
CREATE EVENT SESSION DeprecationAnnouncmentEvents ON SERVER
ADD EVENT sqlserver.deprecation_announcement
(
    ACTION (
        sqlserver.database_id
        , sqlserver.sql_text
        , sqlserver.session_id
        , sqlserver.tsql_stack
        , sqlserver.username
        , sqlserver.client_hostname
        , sqlserver.database_name
        )
)
ADD TARGET package0.asynchronous_file_target (
    SET FILENAME = ''' + @DepPathETL + '''
        , METADATAFILE = ''' + @DepPathMTA + '''
);

ALTER EVENT SESSION DeprecationAnnouncmentEvents ON SERVER
STATE = START;
';
PRINT @cmd;
EXEC (@cmd);
GO
Run Code Online (Sandbox Code Playgroud)