identity-insert - SQL Server 2019 行为随 SET IDENTITY_INSERT ON/OFF 范围的变化

标签 identity-insert sql-server-2019

我们正在迁移到 SQL Server 2019 RTM 版本,并注意到我们的存储过程之一使用 SET IDENTITY_INSERT ON/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 中,我们收到此错误:

Msg 544, Level 16, State 1, Procedure proc_inner, Line 5 [Batch Start Line 36]
Cannot insert explicit value for identity column in table '#TMP_MESSAGE' when IDENTITY_INSERT is set to OFF. (0 rows affected)



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

最佳答案

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

====

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

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

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

enter image description here

关于identity-insert - SQL Server 2019 行为随 SET IDENTITY_INSERT ON/OFF 范围的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881678/

相关文章:

c# - SqlBulkCopy 插入标识列

json - 如何创建一个 SQL 查询来生成两个不同对象的 JSON 数组?

sql - 查询以查找今天和昨天的数据以及伪列之间的差异

sql - 选择组中的最新值

sql-server - SQL Server 导入向导不支持从超过 255 列的 Excel 工作表导入

c# - 如何将 SET IDENTITY_INSERT dbo.myTable 放在 ON 语句中

sql - 当 IDENTITY_INSERT 设置为 OFF 时,无法在表中插入标识列的显式值

entity-framework - 在 EF4 中使用 IDENTITY_INSERT

sql-server - SQL Server 2019 忽略 WHERE 子句?