Результаты на самом деле верны!
Прежде всего, отслеживание изменений и CDC не связаны. CDC - это корпоративная функция, которая фиксирует каждое изменение, включая оригинальные и измененные данные.
Отслеживание изменений, с другой стороны, - это облегченная функция, доступная во всех редакциях, которая возвращает состояние изменения для строки , начиная с определенной версии отслеживания изменений. Вот что делает его таким дешевым в использовании.
Per row
имеет значение здесь, потому что это означает, что только одна запись будет возвращена для каждой строки, даже если она была изменена несколько раз и в конечном итоге удалена. Все изменения, внесенные с момента предоставления @last_sync_version
, будут агрегированы, и будет возвращена одна запись.
Подумайте, в каком состоянии находится строка с PK 0, когда вы запрашиваете все изменения с начала времени, ну, отслеживание? Он новый, поэтому его статус справедливо I
и столбцы не изменены.
Вы получите тот же результат, если будете искать, начиная с минимальной версии этой таблицы. На данный момент таблица отслеживания изменений включает запись I, так что это то, что возвращается.
Если вы запросите изменения с более новой версии, вы получите запись U
:
declare @version bigint=CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('dbo.tdc'));
declare @next bigint=@version+1
select * from CHANGETABLE(CHANGES tdc,@next)q
SYS_CHANGE_VERSION SYS_CHANGE_CREATION_VERSION SYS_CHANGE_OPERATION SYS_CHANGE_COLUMNS SYS_CHANGE_CONTEXT pk
20 NULL U 0x0000000003000000 NULL 0
20 NULL U 0x0000000003000000 NULL 2