Scheduled Job Failure ERROR: [SQLSTATE 42000] (Error 7344)

Scheduled Job Failure ERROR: [SQLSTATE 42000] (Error 7344)

我遇到了来自每小时计划的失败作业之一的以下消息。

作为用户执行:EBGROUP\svc_denue6dscl003_sq。由于列“austrittsdatum”,链接服务器“DEERDS09”的 OLE DB 提供程序“MSDASQL”无法更新 table“[MSDASQL]”。数据值违反了列的完整性约束。 [SQLSTATE 42000](错误 7344)链接服务器“DEERDS09”的 OLE DB 提供程序“MSDASQL”返回消息“不可为空的列无法更新为空。”。 [SQLSTATE 01000](错误 7412)。步骤失败。

此作业有三个步骤,前两个步骤已成功完成,但在更新时每次在第 3 步(如下所述)中均失败。

WITH DEPARTURES as (
    SELECT * FROM OPENQUERY(DEERDSXX, ''SELECT * FROM neue_ma.AustretendeMA ;'')
), PERSON as (
    SELECT PERSNR_WR, AUSTRITT_WR, weblogin_WR,KUENDDATZU_WR 
    FROM [DATEV_DBENGINE].[DENUE6ASXXX\WINDVSW1\DATEV\DATEN\PMS\DATENBANKEN\WIS32DATEVDB].dbo.PERSON 
    WHERE DBACCOUNT = 40 AND PK > 0
)
, JOINPERSNMT as (
SELECT lfdnr, ma_uid, name, vorname, login, letztertag, austrittsdatum, confirmed
, convert(date,Austritt_WR) as Austritt_wr
, convert(date,isnull(KUENDDATZU_WR, Austritt_wr)) as ITDeactivation
, CAST(RIGHT(RTRIM(LTRIM(PERSNR_WR)), 6) as INT) as PERNR
,ISNULL(DATEADD(HOUR, 36, AUSTRITT_WR), CAST(''29991231'' as DATETIME)) as flagdate
,  CASE WHEN SYSDATETIME() >= ISNULL(DATEADD(HOUR, 36, AUSTRITT_WR), CAST(''29991231'' as DATETIME)) THEN 10 else 0 end as confirmed_now
FROM DEPARTURES
LEFT OUTER JOIN PERSON
on person.weblogin_WR=DEPARTURES.Login)
update DEPARTURES set 
DEPARTURES.confirmed=case  confirmed_now when 10 then confirmed_now else DEPARTURES.confirmed end  -- only update when confirmed now
, DEPARTURES.ma_status=case  confirmed_now when 10 then 8 else DEPARTURES.ma_status end  -- only update when confirmed now
, DEPARTURES.austrittsdatum=JOINPERSNMT.Austritt_wr
, DEPARTURES.letztertag=JOINPERSNMT.ITDeactivation
from JOINPERSNMT 
where 
(JOINPERSNMT.Austritt_wr<>DEPARTURES.austrittsdatum or JOINPERSNMT.ITDeactivation<>DEPARTURES.letztertag 
or (JOINPERSNMT.confirmed_now=10 and JOINPERSNMT.confirmed_now<>JOINPERSNMT.confirmed)
) 
and DEPARTURES.ma_uid=JOINPERSNMT.ma_uid and DEPARTURES.login=JOINPERSNMT.LOGIN;'

我检查了没有空值的 'austrittsdatum' 列还检查了具有空值的 Austritt_wr 列,但这是离职日期和仍在组织中的员工,他们不会有离开日期一直到昨天晚上都运行顺利。 RC 是什么?

我在没有更新列的情况下检查了更新逻辑

WITH DEPARTURES as (
    SELECT * FROM OPENQUERY(DEERDS09, 'SELECT * FROM neue_ma.AustretendeMA ;')
), PERSON as (
    SELECT PERSNR_WR, AUSTRITT_WR, weblogin_WR,KUENDDATZU_WR 
    FROM [DATEV_DBENGINE].[DENUE6AS069\WINDVSW1\DATEV\DATEN\PMS\DATENBANKEN\WIS32DATEVDB].dbo.PERSON 
    WHERE DBACCOUNT = 40 AND PK > 0
)
SELECT DEPARTURES.lfdnr, DEPARTURES.ma_uid, DEPARTURES.name, DEPARTURES.vorname, DEPARTURES.login, DEPARTURES.letztertag, DEPARTURES.austrittsdatum, DEPARTURES.confirmed
, convert(date,PERSON.Austritt_WR) as Austritt_wr
, convert(date,isnull(PERSON.KUENDDATZU_WR, PERSON.Austritt_wr)) as ITDeactivation
, CAST(RIGHT(RTRIM(LTRIM(PERSON.PERSNR_WR)), 6) as INT) as PERNR
,ISNULL(DATEADD(HOUR, 36, PERSON.AUSTRITT_WR), CAST('29991231' as DATETIME)) as flagdate
,  CASE WHEN SYSDATETIME() >= ISNULL(DATEADD(HOUR, 36, PERSON.AUSTRITT_WR), CAST('29991231' as DATETIME)) THEN 10 else 0 end as confirmed_now
FROM DEPARTURES
LEFT OUTER JOIN PERSON
on person.weblogin_WR=DEPARTURES.Login
where 
(PERSON.Austritt_wr<>DEPARTURES.austrittsdatum or convert(date,isnull(PERSON.KUENDDATZU_WR, PERSON.Austritt_wr))<>DEPARTURES.letztertag 
or (CASE WHEN SYSDATETIME() >= ISNULL(DATEADD(HOUR, 36, PERSON.AUSTRITT_WR), CAST('29991231' as DATETIME)) THEN 10 else 0 end=10 and 
CASE WHEN SYSDATETIME() >= ISNULL(DATEADD(HOUR, 36, PERSON.AUSTRITT_WR), CAST('29991231' as DATETIME)) THEN 10 else 0 end<>confirmed)
) 
and DEPARTURES.ma_uid=ma_uid and DEPARTURES.login=LOGIN;

它 returns 一个 Austritt_wr 为 NULL 但 KUENDDATZU_WR 具有有效日期的值。根据业务逻辑,这是不合规的。