Изменение поведения SQL Server 2019 с областью действия SET IDENTITY_INSERT ON / OFF

Мы переходим на 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 и более ранних версиях тот же оператор работает правильно.


person Gan    schedule 15.11.2019    source источник
comment
Я получил ответ на свое сообщение в MSDN, и, похоже, это ошибка с изменением поведения в SQL Server 2019 CTP 2.3 - blogs.msdn.microsoft.com/sqlserverstorageengine/2019/03/04/   -  person Gan    schedule 16.11.2019
comment
@ DavidBrowne-Microsoft db ‹› демонстрация скрипки   -  person Lukasz Szozda    schedule 17.11.2019


Ответы (1)


Я получил уведомление от службы поддержки MS, что на самом деле это ошибка новой функции, поэтому, если у кого-то возникнут проблемы с ней, временное решение - отключить эту функцию с помощью двух флагов трассировки:

====

Между тем, если кто-то обновился до SQL 2019 (или любых планов), обходные пути:

Это отключить новую функцию (сокращенные компиляции для временных таблиц) путем включения флагов трассировки. Даже если мы перейдем к обычным таблицам (не временным таблицам), мы не столкнемся с этой проблемой (но поскольку это будет изменение уровня продукта - я не не думаю, что это будет осуществимо в данный момент); Итак, возможный обходной путь, пока мы не исправим эту проблему:

Включение флага трассировки 11036; 11048 в параметрах запуска SQL;

введите описание изображения здесь

person Gan    schedule 18.11.2019
comment
В какой программе кто-нибудь нашел бы диалог на скриншоте? - person Dronz; 02.12.2020