首页 > 解决方案 > SET IDENTITY_INSERT ON/OFF 范围内的 SQL Server 2019 行为变化

问题描述

我们正在迁移到 SQL Server 2019 RTM 版本,并注意到我们使用SET IDENTITY_INSERTON/OFF 语句的存储过程之一失败,该过程在 SQL Server 2017 及更早版本中正常工作。

即使将兼容性级别更改为 SQL Server 2017 在 SQL Server 2019 中的工作方式也不相同。这看起来像是一个没有在任何地方记录的错误/行为更改。

任何人都遇到过类似的问题或知道这是否是已报告的问题?我尝试搜索它,但另一个报告该问题的人是 ODBC 和 SQL Server 2019 CTP 版本的组合。

我们有很多客户在 SQL Server 2017 和更早版本上运行我们产品的早期版本,我们无法更改但仍希望迁移到 SQL Server 2019 的存储过程,现在这已成为我们 SQL Server 2019 迁移的阻碍.

这是在 SQL Server 2019 中失败但在 SQL Server 2017 及之前版本中运行良好的代码片段

如何重现行为。

CREATE PROC proc_inner
AS
BEGIN
    SET IDENTITY_INSERT [#TMP_MESSAGE] ON;

    INSERT INTO [#TMP_MESSAGE] (DCORP, ENTITYKEY, SEQNO, MESSAGE)
        SELECT 
            'test', 1, 1, 'bdkfsjk';

    SET IDENTITY_INSERT #TMP_MESSAGE OFF;
END;
GO

CREATE PROC proc_outer
AS
BEGIN
    IF OBJECT_ID('TEMPDB..[#TMP_MESSAGE]') IS NULL
    BEGIN
        CREATE TABLE [#TMP_MESSAGE]
        (
             DCORP     CHAR(10), 
             ENTITYKEY INT, 
             SEQNO     INT IDENTITY(1, 1), 
             MESSAGE   VARCHAR(8000)
        );
    END;

    EXEC proc_inner;

    SELECT *
    FROM #TMP_MESSAGE;
END;
GO

EXEC proc_outer; -- this statement fails on SQL 2019

在 SQL Server 2019 中,我们收到此错误:

消息 544,级别 16,状态 1,过程 proc_inner,第 5 行 [批处理开始第 36 行]
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“#TMP_MESSAGE”中插入标识列的显式值。(0 行受影响)

在 SQL Server 2017 及更早版本中,相同的语句可以正常工作。

标签: identity-insertsql-server-2019

解决方案


我收到了来自 MS 支持的通知,它实际上是新功能的一个错误,因此如果有人对此有疑问,临时解决方法是使用两个跟踪标志禁用该功能:

====

与此同时,如果有人升级到 SQL 2019(或任何计划),解决方法是

是通过启用跟踪标志来禁用新功能(减少临时表的编译)即使我们移动到常规表(非临时表),我们也不会遇到这个问题(但这将是产品级别的变化——我不'认为这在此时是不可行的);所以在我们解决这个问题之前可行的解决方法:

在 SQL 启动参数中启用跟踪标志 11036;11048 ;

在此处输入图像描述


推荐阅读