我们有一个包含列的 OrderLines 表:
Quantity int not null
QtyCancelled int not null
QtyBackorder int not null
QtyPicking int not null
QtyPacking int not null
QtyShiped int not null
计算列和持久列 FulfillmentStatusId 为:
dbo.clr_GetFulfillmentStatusByLineQuantities(Quantity, QtyCancelled, QtyBackorder, QtyPicking, QtyPacking, QtyShiped)
“clr_GetFulfillmentStatusByLineQuantities”,当然,通过标量函数映射到数据库中的 ASSEMBLY,相关方法 (C#) 标记为:
[SqlFunction(DataAccess = None, IsDeterministic = true, IsPrecise = true, SystemDataAccess = None)]
关于这个问题,我多次针对这个表运行 DBCC CHECKTABLE ,它仍然是 has_unchecked_assembly_data=1。当列首次添加到表中时确实如此,但我相信 DBCC CHECKTABLE 命令在迁移到 SQL 2016 之前成功了。
虽然该表已在 has_unchecked_assembly_data=1 下使用了很长时间,但似乎对该表的功能没有影响。我担心 ALTER ASSEMBLY 在不使用 WITH UNCHECKED DATA 时抛出异常,然后在我确实使用该选项时抛出另一个异常,但似乎“根据 MVID”更新程序集。
对不起,如果我漫无边际,我不会问太多问题而且我主要是潜伏。
不过,请提前致谢!
更新 (20180917T17:34-05:00):感谢 Sean 提出了初步方向。DBCC CHECKTABLE ('OrderLines') WITH EXTENDED_LOGICAL_CHECKS的结果是两行类似于:
Msg 2537, Level 16, State 106, Line 1
Table error: object ID 1486732449, index ID 1, partition ID 72057594403946496, alloc unit ID 72057594422755328 (type In-row data), page (1:1430554), row 5. The record check (valid computed column) failed. The values are 38 and 0.
因此,我对表的主键(即上面指示的索引 ID 1)执行了 REBUILD,这成功了。然而,重新运行DBCC CHECKTABLE('OrderLines') WITH EXTENDED_LOGICAL_CHECKS再次返回类似的错误,只是这次使用不同的分区 ID 和分配单元 ID(正如人们所预料的那样)。
极端的解决方案可能是删除、重新创建并使用标识插入重新填充表,可以这么说,“从轨道上删除站点”,但出于显而易见的原因,这是极端的。
“表的聚集索引中的计算列数据似乎不一致”的正确解决方案是什么?