SQL Server 2016 MERGE Причина Сбой проверки утверждения системы

Позвольте мне сначала сказать, что я понимаю, что Microsoft говорит, что у них есть исправление ошибки, но мы установили накопительное обновление для 2016 года, и нам все равно не повезло. Это MERGE для SCD типа 2, который отлично работал в 2014 году. Мы тестируем наше обновление до 2016 года, когда появилась эта ошибка. Ниже приведен пример запроса, который вызывает проблему.

/* Type 2 Merge */
INSERT INTO BDW.DMEmployer 
                (
                SCD_Current,
                Source_System,
                Company,
                Employer_Number
                )
SELECT          SCD_Current,
                Source_System,
                Company,
                Employer_Number
FROM
    (
       MERGE BDW.DMEmployer dim
       USING ETLWork.work.DMEmployer work
              ON     dim.Employer_Number = work.Employer_Number AND dim.Company = work.Company
       -- This inserts new records in the dimension table
       WHEN NOT MATCHED THEN
              INSERT (SCD_Current,
                    Source_System,
                    Company,
                    Employer_Number
       VALUES (     'Y',
                    work.last_updated,
                    'I',
                    'POINT',
                    work.Company,
                    work.Employer_Number
       WHEN MATCHED AND dim.SCD_Current = 'Y'
                    AND ( dim.Employer_FEIN <> work.Employer_FEIN ) THEN
               UPDATE SET   SCD_Current='N', 
                            SCD_Valid_To_Date = work.last_updated-2
    
        OUTPUT $Action
                    Action_Taken,                                          
                    'Y' AS SCD_Current,
                    work.Source_System,
                    work.Company,
                    work.Employer_Number
    ) AS MERGE_OUT
WHERE MERGE_OUT.Action_Taken = 'UPDATE';

Если бы вы запускали только внутренний MERGE, это не было бы проблемой. Но попытка запустить все это сейчас, в 2016 году, приводит к следующему сбою. Мы попробовали исправить ошибку, но мне интересно, не пропустил ли я что-то еще. Он добавляет только ~ 150 строк во внешнюю часть INSERT INTO.

Сообщение об ошибке:

Расположение: pageref.cpp:955

Выражение: IS_OFF (BUF_MINLOGGED, m_buf-›bstat) || pageModifyType != PageModifyType_Contents || GetPagePtr ()->IsTextPage ()

ИДП: 52

Идентификатор процесса: 2820

Сообщение 3624, уровень 20, состояние 1, строка 3 Ошибка проверки подтверждения системы. Подробности смотрите в журнале ошибок SQL Server. Как правило, ошибка утверждения вызвана ошибкой программного обеспечения или повреждением данных. Чтобы проверить наличие повреждений базы данных, рассмотрите возможность запуска DBCC CHECKDB. Если вы согласились отправлять дампы в Microsoft во время установки, в Microsoft будет отправлен мини-дамп. Обновление может быть доступно от Microsoft в последнем пакете обновления или в исправлении от службы технической поддержки.

Сообщение 10054, уровень 20, состояние 0, строка 0 Произошла ошибка транспортного уровня при получении результатов с сервера. (поставщик: поставщик TCP, ошибка: 0 — существующее соединение было принудительно закрыто удаленным хостом.)

Мы запустили DBCC CHECKDB, который не обнаружил ничего поврежденного. Итак, это все еще ошибка или есть какие-то настройки, которые я мог пропустить во время нашей установки? Спасибо за помощь.


person rlphilli    schedule 27.09.2017    source источник
comment
Попробуйте опубликовать его на dba.stackexchange.com и обновите свой вопрос, указав результат выбора @@version.   -  person sepupic    schedule 27.09.2017
comment
не проблема, но в вашем merge отсутствует закрывающая скобка после insert (.... и values ( ...   -  person SqlZim    schedule 27.09.2017
comment
Спасибо. Я опубликую там.   -  person rlphilli    schedule 27.09.2017
comment
Вы пытались сначала вывести во временную таблицу и вставить в BDW.DMEmployer из временной таблицы?   -  person SqlZim    schedule 27.09.2017
comment
Я думал о временной таблице и собираюсь попробовать это в следующий раз. Просто не уверен, почему это работает хорошо в 2014 году, а не в 2016 году, даже с последним накопительным обновлением. Нашел аналогичный вопрос на dba.stackexchange.com, но они сказали, что CU решил их проблему. Попробую временную таблицу, так как она сейчас наименее навязчива. Спасибо за ответы.   -  person rlphilli    schedule 27.09.2017


Ответы (1)


По моему опыту, использование модели восстановления = простой иногда дает эту ошибку. Переключение на модель восстановления = полное устраняет проблему и было моим обходным путем, хотя и не идеальным.

person Sven Erik Håberg    schedule 20.03.2018
comment
Спасибо! Это решает проблему в моем случае на @@VERSION=Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) 22 августа 2017 г. 17:04:49 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-разрядная версия) на Windows Server 2016 Standard 10.0 ‹X64› (сборка 14393:) (гипервизор) - person JGooLaaR; 18.09.2020