You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建实现SCD Type 4的历史表填充存储过程技术咨询

实现SCD Type 4逻辑的存储过程方案

需求概述

  • 当Customer表插入新客户时,需将新客户同步至Customer_hist表
  • 当Customer表中客户信息发生变更时,需在Customer_hist表新增该客户的最新记录,并将旧记录的ValidTo字段更新为当前时间
  • 若Customer表记录无变更,则不对Customer_hist表做任何修改

示例表结构

Customer表

idname
1Martin
2Danny

Customer_hist表

idnamevalidFromvalidTo
1Martyn2022-05-052022-09-20
1Martin2022-09-212999-12-31
2Danny2022-05-052999-12-31

存储过程实现(SQL Server 语法)

CREATE PROCEDURE dbo.PopulateCustomerHist
AS
BEGIN
    SET NOCOUNT ON;

    -- 定义当前时间变量,统一时间戳
    DECLARE @CurrentDateTime DATETIME = GETDATE();

    -- 1. 更新变更客户的旧有效记录
    UPDATE ch
    SET ch.ValidTo = @CurrentDateTime
    FROM Customer_hist ch
    INNER JOIN Customer c ON ch.id = c.id
    WHERE ch.ValidTo = '2999-12-31'
      AND (ch.name <> c.name 
           -- 有其他业务字段时,继续添加对比条件:OR ch.phone <> c.phone
           );

    -- 2. 插入变更客户的新有效记录
    INSERT INTO Customer_hist (id, name, validFrom, validTo)
    SELECT c.id, c.name, @CurrentDateTime, '2999-12-31'
    FROM Customer c
    INNER JOIN Customer_hist ch ON c.id = ch.id
    WHERE ch.ValidTo = @CurrentDateTime
      AND ch.name <> c.name;

    -- 3. 插入新增客户的记录
    INSERT INTO Customer_hist (id, name, validFrom, validTo)
    SELECT c.id, c.name, @CurrentDateTime, '2999-12-31'
    FROM Customer c
    LEFT JOIN Customer_hist ch ON c.id = ch.id
    WHERE ch.id IS NULL;
END
GO

逻辑说明

  1. 标记失效旧记录:匹配Customer_hist中当前有效的记录(ValidTo为2999-12-31),与Customer表对比字段值,不一致则将旧记录的ValidTo设为当前时间,标记失效。
  2. 插入新有效记录:针对刚被标记失效的客户,将Customer表的最新信息插入Customer_hist,设置新记录的生效时间为当前时间,失效时间为默认最大值。
  3. 同步新增客户:将Customer表中未在Customer_hist出现过的客户直接插入历史表,标记为有效记录。

注意事项

  • 若Customer表有其他业务字段,需在对比条件中添加对应字段判断,确保所有变更被捕获。
  • 时间字段建议使用DATETIME2类型提升精度,示例用DATETIME适配通用场景。
  • 可根据业务调整ValidTo的默认最大值(如9999-12-31)。

内容的提问来源于stack exchange,提问作者Preshy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:45:28