?
?
-- 获取一个表的最低有效版本号
SELECT CHANGE_TRACKING_MIN_VALID_VERSION( OBJECT_ID('dbo.TestTab'))
-- 返回与上次提交的事务相关联的版本,以确定下次需要更改时将使用的版本
SELECT CHANGE_TRACKING_CURRENT_VERSION()
-------------------- 0 (1 行受影响) -------------------- 4 (1 行受影响)
再次用CHANGETABLE 查看:
?
?
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,0) as T
为什么不是更新(SYS_CHANGE_OPERATION = 'U')??
?
last_sync_version = 0 为当时的跟踪情况,现在 SYS_CHANGE_VERSION 已经大于1 了,要查询各状态当时更改情况,如:
?
-- 返回最后一次版本号之后的更改(需指定 last_sync_version ) -- 该值 last_sync_version 必须保持记住,下次可以现在查到的@last_sync_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,0) as T SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,1) as T SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,2) as T SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,3) as T
注:最后两次更改是相同的的,所以 SYS_CHANGE_COLUMNS 一样。
?
还可以使用 CHANGE_TRACKING_IS_COLUMN_IN_MASK查看更改列情况 (需启用 TRACK_COLUMNS_UPDATED = ON )
?
-- 检查更改跟踪(查看哪些列曾更改) SELECT CHANGE_TRACKING_IS_COLUMN_IN_MASK (, ) -- column_id : 是正在被检查的列的 ID。 可以使用 COLUMNPROPERTY 函数获取此列 ID。 -- change_columns : 是 CHANGETABLE 数据的 SYS_CHANGE_COLUMNS 列中的二进制数据。 --(如主键列更改,视为删除旧值,插入新值) SELECT id ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'id','COLUMNID'),SYS_CHANGE_COLUMNS) id_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'name','COLUMNID'),SYS_CHANGE_COLUMNS) name_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'insertDate','COLUMNID'),SYS_CHANGE_COLUMNS) insertdate_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'value','COLUMNID'),SYS_CHANGE_COLUMNS) value_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'info','COLUMNID'),SYS_CHANGE_COLUMNS) info_is_changed FROM CHANGETABLE(CHANGES dbo.TestTab,1) AS T WHERE SYS_CHANGE_OPERATION='U'
?
在进行删除和插入操作:
?
delete from [dbo].[TestTab] where id=1 insert into [dbo].[TestTab](id,name,insertDate,value,info) select 4,'kk',GETDATE(),10,'info'
-- 查看版本号为3之后都操作了什么? SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,3) as T
?
对于当前表的记录是:
?
SELECT T.id,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,D.* FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T LEFT JOIN [dbo].[TestTab] AS D ON T.id = D.id
?
?
对于数据定时转移的情况: 源表中数据进行了 insert,update,delete 操作 目标表操作如下: insert : 跟踪表关联源表,查询到的数据插入到目标表中.(即使插入后的数据发送更改,在改版本号之显示还是操作插入"I") update : 跟踪表关联源表,查询到的数据更新到目标表中.也可使用函数 CHANGE_TRACKING_IS_COLUMN_IN_MASK 更新了哪些列 delete : 对于删除 (SYS_CHANGE_OPERATION = 'D'),跟踪表直接对目标表进行删除(注意主键不可相同!否则可能删错)
--数据转移情况,根据版本号更改,所以版本号要记住! 源表: [TestTab] 目标表: [TargetTestTab] --insert : INSERT INTO [TargetTestTab](id,name,insertDate,value,info) SELECT D.id,name,insertDate,value,info FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T INNER JOIN [dbo].[TestTab] AS D ON T.id = D.id WHERE SYS_CHANGE_OPERATION = 'I' --update : UPDATE K SET K.id=D.id,K.name=D.name,K.insertDate=D.insertDate,K.value=D.value,K.info=D.info FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T INNER JOIN [dbo].[TestTab] AS D ON T.id = D.id INNER JOIN [db