【问题标题】:SQL Server 2019 Behavior change with scope of SET IDENTITY_INSERT ON/OFFSET IDENTITY_INSERT ON/OFF 范围内的 SQL Server 2019 行为变化
【发布时间】:2019-11-15 17:08:33
【问题描述】:

我们正在迁移到 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 迁移。

这里的代码 sn-p 在 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-insert sql-server-2019


【解决方案1】:

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

====

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

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

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

【讨论】:

  • 屏幕截图中的对话框会在什么程序中找到?
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多