我们正在迁移到 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;
关于identity-insert - SQL Server 2019 行为随 SET IDENTITY_INSERT ON/OFF 范围的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881678/