【问题标题】:SQL Server 2016 MERGE Causing A system assertion check has failedSQL Server 2016 MERGE 导致系统断言检查失败
【发布时间】:2017-09-27 12:27:59
【问题描述】:

首先让我说,我知道微软说他们有一个bug fix,但我们已经安装了 2016 年的累积更新,但仍然没有运气。这是 2014 年运行良好的 SCD 类型 2 的 MERGE。出现此错误时,我们正在测试升级到 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 年运行整个事情会导致以下失败。我们已经尝试了错误修复,但我想知道我是否错过了其他东西。它只在外部 INSERT INTO 部分添加了约 150 行。

错误信息:

位置:pageref.cpp:955

表达式:IS_OFF (BUF_MINLOGGED, m_buf->bstat) || pageModifyType != PageModifyType_Contents || GetPagePtr()->IsTextPage()

SPID:52

进程 ID:2820

Msg 3624, Level 20, State 1, Line 3 系统断言检查有 失败的。有关详细信息,请查看 SQL Server 错误日志。通常,一个 断言失败是由软件错误或数据损坏引起的。到 检查数据库损坏,考虑运行 DBCC CHECKDB。如果你 同意在安装过程中向 Microsoft 发送转储,一个小型转储将 发给微软。 Microsoft 可能会在 最新的 Service Pack 或来自技术支持的修补程序。

Msg 10054,级别 20,状态 0,行 0 从服务器接收结果时发生。 (提供者:TCP 提供程序,错误:0 - 现有连接被强制关闭 远程主机。)

我们运行了 DBCC CHECKDB,结果发现没有任何损坏。那么,这仍然是一个错误,还是我在安装过程中可能忽略了一些设置?感谢您的帮助。

【问题讨论】:

  • 尝试将其发布到dba.stackexchange.com 并使用选择@@version 的结果更新您的问题
  • 不是问题,但您的mergeinsert (....values ( ... 之后缺少一个结束括号
  • 谢谢。我会在那里发帖。
  • 您是否尝试过先输出到临时表,然后从临时表中插入BDW.DMEmployer
  • 我确实考虑过临时表,接下来我会尝试。只是不确定为什么它在 2014 年运行良好,而不是在 2016 年,即使有最新的累积更新。在 dba.stackexchange.com 上发现了一个类似的问题,但他们说 CU 解决了他们的问题。将尝试临时表,因为这是目前最不打扰的。感谢您的回复。

标签: sql-server sql-server-2016 sql-merge


【解决方案1】:

根据我使用 recovery model = simple 的经验,有时会出现此错误。切换到恢复模式 = 完全消除了问题,这是我的解决方法,尽管不是理想的解决方法。

【讨论】:

  • 谢谢!这是解决我在@@VERSION="Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) 上的问题在 Windows Server 2016 Standard 10.0 (Build 14393: ) (Hypervisor) "
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2013-08-17
  • 2020-10-19
  • 1970-01-01
  • 2017-07-30
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多