Мы переходим на RTM-версию SQL Server 2019 и заметили, что одна из наших хранимых процедур, использующая 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, уровень 16, состояние 1, процедура proc_inner, строка 5 [Batch Start Line 36]
Невозможно вставить явное значение для столбца идентификаторов в таблицу '#TMP_MESSAGE', когда для IDENTITY_INSERT установлено значение OFF. (Затронуто 0 строк)
В SQL Server 2017 и более ранних версиях тот же оператор работает правильно.