SQL Server存储过程改造:更新水印时保留旧水印值
SQL Server水印存储过程改造方案(保留历史水印且不新增记录)
1. 调整水印表结构
先将原有水印表调整为包含Table、OldWaterMark、NewWaterMark的结构,确保每个业务表对应唯一一条记录(用Table列作为主键):
-- 针对已有表的结构调整 ALTER TABLE WatermarkTable DROP COLUMN IF EXISTS WatermarkValue; ALTER TABLE WatermarkTable ADD OldWaterMark VARCHAR(255), -- 根据实际水印值类型调整(如datetime、int) NewWaterMark VARCHAR(255); -- 设置Table列为主键(若未设置) ALTER TABLE WatermarkTable ADD CONSTRAINT PK_WatermarkTable_Table PRIMARY KEY ([Table]);
如果是新建表,直接执行:
CREATE TABLE WatermarkTable ( [Table] VARCHAR(100) PRIMARY KEY, OldWaterMark VARCHAR(255), NewWaterMark VARCHAR(255) );
2. 改造后的存储过程
存储过程实现不新增记录、仅更新历史水印的逻辑:当业务表存在水印记录时,将原NewWaterMark移至OldWaterMark,再写入新水印值;不存在则初始化插入。
CREATE PROCEDURE UpdateWatermark @TableName VARCHAR(100), @NewWatermarkValue VARCHAR(255) -- 按需修改类型(如datetime、bigint) AS BEGIN SET NOCOUNT ON; IF EXISTS (SELECT 1 FROM WatermarkTable WHERE [Table] = @TableName) BEGIN -- 更新:将旧最新水印转为历史水印,写入新值 UPDATE WatermarkTable SET OldWaterMark = NewWaterMark, NewWaterMark = @NewWatermarkValue WHERE [Table] = @TableName; END ELSE BEGIN -- 初始化:首次插入该业务表的水印记录 INSERT INTO WatermarkTable ([Table], OldWaterMark, NewWaterMark) VALUES (@TableName, NULL, @NewWatermarkValue); END END
3. ADF流水线调用说明
在ADF流水线中调用该存储过程时,只需传入两个参数:
@TableName:需要同步的业务表名称@NewWatermarkValue:从ADF获取的最新水印值(如最新时间戳、最大ID等)
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

