我们正在迁移到 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 中,我们收到此错误:
消息 544,级别 16,状态 1,过程 proc_inner,第 5 行 [批处理开始第 36 行]
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“#TMP_MESSAGE”中插入标识列的显式值。(0 行受影响)
在 SQL Server 2017 及更早版本中,相同的语句可以正常工作。