时间表上的合并失败,尝试将非NULL-able列的值设置为NULL [英] Merge on temporal table fails with Attempting to set a non-NULL-able column's value to NULL

查看:93
本文介绍了时间表上的合并失败,尝试将非NULL-able列的值设置为NULL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

工作流程:


  1. 在数据仓库中创建包含默认历史记录表的时态表
  2. 在历史表上创建索引
  3. 每小时对时态表执行合并语句
  4. 请注意,有时错误会产生: 尝试设置非NULL-将列的值设置为NULL
  5. 从历史记录表中删除索引
  6. 使用相同的数据集执行合并,并且它将成功
  7. 重新创建索引在历史表上
  8. 随机错误将再次生成,重复步骤5到7

开4月29日我创建了一个名为[dbo]。[FactPersonnelScheduleDetails_Current]的新时态表,其中包含一个名为[History]的默认历史表。[FactPersonnelScheduleDetails_Current]。

On April 29th I created a new temporal table named [dbo].[FactPersonnelScheduleDetails_Current] with a default history table named [History].[FactPersonnelScheduleDetails_Current].

此表位于执行的数据仓库中每小时几次合并声明。

This table is in a data warehouse that performs several merge statements on an hourly basis.

自4天前实施此表以来,两次合并交易因以下错误而失败:"尝试将非NULL-able列的值设置为NULL"

Twice now since implementing this table 4 days ago, the merge transaction has failed with the following error: "Attempting to set a non-NULL-able column's value to NULL"

History表具有一个用户定义的索引。只要删除该索引,我就可以成功完成合并。

The History table has one user-defined index. As soon as I drop that index, I can the successfully complete the merge.

当我在历史记录表上创建了用户定义的索引时,为什么MERGE失败的任何建议,但在我删除用户定义的索引?

Any suggestions why the MERGE is failing when I have a user defined index created on the history table, but works when I remove the user defined index?

CREATE TABLE [dbo].[FactPersonnelScheduleDetails_Current] ( 
[ScheduleCellKey]                    INT                NOT NULL,
[ScheduleCellID]                     INT                NOT NULL,
[DBID]                               SMALLINT           NOT NULL,
[ScheduleDetailsID]                  INT                NOT NULL,
[RecordNumber]                       SMALLINT               NULL,
[WorkDate]                           DATE                   NULL,
[WorkDateKey]                        INT                    NULL,
[WeekStartDate]                      DATE                   NULL,
[DayOfTheWeek]                       VARCHAR(50)            NULL,
[WorkDayNumber]                      TINYINT                NULL,
[MasterScheduleCellKey]              INT                    NULL,
[WorkingScheduleMatchesMasterScheduleFlag] VARCHAR(3)       NULL,
[DateWorkingScheduleNoLongerMatchesMaster] DATETIME2(7)     NULL,
[IsHoliday]                          VARCHAR(3)             NULL,
[JobPostDetailID]                    INT                    NULL,
[JobPostDetailKey]                   INT                    NULL,
[JobNumber]                          VARCHAR(10)        NOT NULL,
[JobKey]                             INT                NOT NULL,
[JobTierKey]                         INT                NOT NULL,
[EmployeeNumber]                     INT                    NULL,
[EmployeeKey]                        INT                    NULL,
[CategoriesDetailID]                 INT                    NULL,
[BillCategory]                       VARCHAR(50)            NULL,
[HoursTypeID]                        SMALLINT               NULL,
[HoursTypeDescription]               VARCHAR(50)            NULL,
[PaycheckDescriptionId]              SMALLINT               NULL,
[PaycheckDescription]                VARCHAR(50)            NULL,
[RecordTypeID]                       TINYINT                NULL,
[Hours]                              DECIMAL(19,4)          NULL,
[InTime]                             TIME(3)                NULL,
[InTimeString]                       VARCHAR(8)             NULL,
[InDateTime]                         DATETIME               NULL,
[OutTime]                            TIME(3)                NULL,
[OutTimeString]                      VARCHAR(8)             NULL,
[OutDateTime]                        DATETIME               NULL,
[LunchHours]                         DECIMAL(19,4)          NULL,
[NextDay]                            VARCHAR(3)         NOT NULL,
[PayRate]                            MONEY                  NULL,
[SpecialPayRate]                     VARCHAR(3)         NOT NULL,
[ForceOTToThisJob]                   VARCHAR(3)         NOT NULL,
[OvertimeHours]                      DECIMAL(19,4)          NULL,
[DoubletimeHours]                    DECIMAL(19,4)          NULL,
[InvoiceNumber]                      INT                    NULL,
[InvoiceDescription]                 VARCHAR(100)           NULL,
[TierDescription]                    VARCHAR(100)           NULL,
[BillRate]                           MONEY                  NULL,
[SpecialBillRate]                    VARCHAR(3)         NOT NULL,
[BillingPayRate]                     MONEY                  NULL,
[NonBillableTypeID]                  SMALLINT               NULL,
[NonBillableTypeDescription]         VARCHAR(50)            NULL,
[LastChangedBy]                      VARCHAR(20)            NULL,
[LastChangedDate]                    DATETIME               NULL,
[DaysBetweenWorkDateAndModifiedDate] INT                    NULL,
[UpdatedToTKHours]                   VARCHAR(3)             NULL,
[SpecialInvoiceDescription]          VARCHAR(3)             NULL,
[SpecialTierDescription]             VARCHAR(3)             NULL,
[InvoiceDetailID]                    INT                    NULL,
[TTMStatusID]                        INT                    NULL,
[IsConfirmed]                        VARCHAR(3)             NULL,
[DateConfirmed]                      DATETIME               NULL,
[IsPublished]                        VARCHAR(3)             NULL,
[AcceptedTypeForPSTT]                TINYINT                NULL,
[TeamTimeAcceptedTypeDescription]    VARCHAR(50)            NULL,
[UserName]                           VARCHAR(20)            NULL,
[DateChanged]                        datetime               NULL,
[Notes]                              VARCHAR(255)           NULL,
[SystemNotes]                        VARCHAR(8000)          NULL,
[ETLDateChanged]                     DATETIME2(7)       NOT NULL DEFAULT (sysdatetime()),
[RecordInsertTimestamp]              DATETIME2(7)       NOT NULL DEFAULT (sysdatetime()),
[RecordUpdateTimestamp]              DATETIME2(7)       NOT NULL DEFAULT (sysdatetime()),
SysStartTime datetime2(0) GENERATED ALWAYS AS ROW START CONSTRAINT DF_SysStart DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2(0) GENERATED ALWAYS AS ROW END CONSTRAINT DF_SysEnd DEFAULT CONVERT(datetime2 (0), '9999-12-31 23:59:59'),
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),
CONSTRAINT PK_FactPersonnelScheduleDetails_Current PRIMARY KEY NONCLUSTERED (ScheduleCellKey))
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.FactPersonnelScheduleDetails_Current));

CREATE CLUSTERED INDEX [IX01_FactPersonnelScheduleDetails_Current]
ON [dbo].[FactPersonnelScheduleDetails_Current] (WorkDateKey,DBID);

CREATE NONCLUSTERED INDEX [IX02_FactPersonnelScheduleDetails_Current]
ON [dbo].[FactPersonnelScheduleDetails_Current] (JobKey)
INCLUDE (ScheduleCellKey,DBID,WeekStartDate,JobTierKey,EmployeeKey,Hours,WorkingScheduleMatchesMasterScheduleFlag);

CREATE NONCLUSTERED INDEX [IX03_FactPersonnelScheduleDetails_Current]
ON [dbo].[FactPersonnelScheduleDetails_Current] (RecordUpdateTimestamp,MasterScheduleCellKey)
INCLUDE (ScheduleCellKey,WeekStartDate,DayOfTheWeek,JobPostDetailKey,JobKey,EmployeeKey,CategoriesDetailID,Hours,InTime,OutTime,NextDay,PayRate,SpecialPayRate,ForceOTToThisJob,BillRate,SpecialBillRate,NonBillableTypeID,ETLDateChanged,RecordNumber,WorkingScheduleMatchesMasterScheduleFlag);

CREATE NONCLUSTERED INDEX [IX04_FactPersonnelScheduleDetails_Current]
ON [dbo].[FactPersonnelScheduleDetails_Current] (WorkingScheduleMatchesMasterScheduleFlag)
INCLUDE (ScheduleCellKey,DBID,WeekStartDate,JobKey,JobTierKey,EmployeeKey,DateWorkingScheduleNoLongerMatchesMaster);

CREATE NONCLUSTERED INDEX [IX01_FactPersonnelScheduleDetails_Current]
ON [History].[FactPersonnelScheduleDetails_Current] (WorkDateKey,DBID)
INCLUDE (ScheduleCellKey,WeekStartDate,JobKey,JobTierKey,EmployeeKey,Hours,SysStartTime,SysEndTime);

推荐答案

嗯,这听起来很不幸!

Well, that sounds unfortunate!

出于好奇,我发现WorkDateKey可以为空。

Just out of curiosity, I see that WorkDateKey is nullable.

你知道这是什么吗?当数据失败时,数据的值是什么? 只是想知道该复合聚集键值中的空值是否可能是其中的一部分 - 尽管我看不出它是否重要。

Do you have any idea what the values of the data are, when it fails like that?  Just wondering if null values in that compound clustered key value might be a part of it - though I can't see that it should matter.

Josh


这篇关于时间表上的合并失败,尝试将非NULL-able列的值设置为NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆