SQL Server 2012变更追踪获取最新版本行问题求助
问题描述
我已在SQL Server 2012数据库中启用变更跟踪:
ALTER DATABASE SEMESS SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
同时为指定表启用变更跟踪:
ALTER TABLE SEMESS.QRQC.Vorgang ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON);
之后我尝试编写存储过程获取该表的最后修改记录,用到以下代码但无法正常工作:
DECLARE @next_baseline bigint; SET @next_baseline = CHANGE_TRACKING_CURRENT_VERSION();
我的目标是获取最高/最新版本号对应的行,恳请提供解决思路或技巧。
另外,我有一个可正常运行的存储过程,但它会返回所有变更记录:
CREATE PROCEDURE QRQC.WatchVorgangChanges AS BEGIN SELECT * FROM CHANGETABLE(CHANGES QRQC.Vorgang, 0) AS CT; END
解决思路
1. 理清变更版本的核心逻辑
CHANGE_TRACKING_CURRENT_VERSION()返回的是下一次变更将使用的版本号,并非当前已存在的最新变更版本。要获取已存在的最新版本,需要从变更结果集中筛选,或结合系统函数判断。
2. 获取最新版本变更记录的两种实用方法
方法一:直接筛选最大版本号
从CHANGETABLE的结果里按版本号倒序取最新记录,若同一版本有多条变更(比如同一事务修改多行),用TOP 1 WITH TIES可返回所有同版本记录:
CREATE PROCEDURE QRQC.GetLatestVorgangChanges AS BEGIN -- 返回所有最新版本的变更记录 SELECT TOP 1 WITH TIES * FROM CHANGETABLE(CHANGES QRQC.Vorgang, 0) AS CT ORDER BY CT.SYS_CHANGE_VERSION DESC; END
如果只需要单条最新记录,去掉WITH TIES即可。
方法二:先获取最新版本号再精准查询
先拿到当前存在的最大版本号,再用该版本号过滤结果:
CREATE PROCEDURE QRQC.GetLatestVorgangChanges AS BEGIN DECLARE @latest_version bigint; -- 从变更表中获取最大版本号 SELECT @latest_version = MAX(SYS_CHANGE_VERSION) FROM CHANGETABLE(CHANGES QRQC.Vorgang, 0) AS CT; -- 仅当存在变更记录时执行查询 IF @latest_version IS NOT NULL BEGIN SELECT * FROM CHANGETABLE(CHANGES QRQC.Vorgang, @latest_version - 1) AS CT WHERE SYS_CHANGE_VERSION = @latest_version; END END
这里CHANGETABLE(CHANGES ..., @latest_version -1)会返回版本号大于@latest_version -1的变更,也就是精准匹配最新版本的记录。
3. 关键注意点
- 同一事务内的多行变更会共享同一个版本号,需根据业务需求决定是否返回所有同版本记录。
- 若表无任何变更,
MAX(SYS_CHANGE_VERSION)会返回NULL,需添加空值判断避免无效查询。
内容的提问来源于stack exchange,提问作者Simon Giesen
相关产品推荐
相关产品推荐

