【发布时间】: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 及更早版本中,相同的语句可以正常工作。
【问题讨论】:
-
我收到了对我在 MSDN 上的帖子的回复,似乎是 SQL Server 2019 CTP 2.3 - blogs.msdn.microsoft.com/sqlserverstorageengine/2019/03/04/… 中行为变化的错误
-
@DavidBrowne-Microsoft db<>fiddle demo
标签: identity-insert sql-server-2019