CHANGE_TRACKING_MIN_VALID_VERSION,CHANGE_TRACKING_CURRENT_VERSION)
?
?
-- 获取一个表的最低有效版本号
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