更新行时,SYS_CHANGE_OPERATION 列在查询CHANGETABLE时仍显示 I(插入)而不是 U(更新) 。
这就是我在做什么。
USE master
GO
CREATE DATABASE TestCT ;
GO
SELECT compatibility_level , @@VERSION
FROM sys.databases WHERE name = 'TestCT';
compatibility_level = 160
@@Version = Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) Oct 8 2022 05:58:25 版权所有 (C) 2022 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 10.0 (Build 19045:)(管理程序)
ALTER DATABASE TestCT
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) ;
USE TestCT;
GO
DROP TABLE IF EXISTS dbo.TestCT
CREATE TABLE dbo.TestCT(
Id INT IDENTITY (1,1) CONSTRAINT PK__TestCT PRIMARY KEY ,
Col1 VARCHAR(100)
) ;
GO
ALTER TABLE dbo.TestCT
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON) ;
GO
INSERT INTO dbo.TestCT (Col1)
VALUES ('INSERT1') ;
GO
SELECT *
FROM CHANGETABLE (CHANGES dbo.TestCT,0) as CT
LEFT JOIN dbo.TestCT EM ON CT.Id = EM.Id
ORDER BY SYS_CHANGE_VERSION ;
GO
SYS_CHANGE_OPERATION
正如预期的那样,这是我(插入)。
现在,如果我更新行
UPDATE T
SET Col1 = 'UPDATE'
FROM dbo.TestCT T
WHERE Col1 = 'INSERT1';
GO
SYS_CHANGE_OPERATION
这里仍然是 I(插入)而不是 U(更新)。如您所见SYS_CHANGE_VERSION
,已按预期增加了 1。
我在这里做错了什么?
除了 ;-),您没有做错任何事,在这种情况下,结果应该是一个 INSERT。这是因为在您的查询中,您请求的所有内容都以 0 开头。
这意味着,您将从 0 开始定义。从 0 开始,有一个 INSERT 和一个更新,但是当您看到数据时,它会有最新的结果。因此更新不相关。从 0 开始,它一直是读者的 INSERT。当你改变 1 中的 0 时,SQL 将看到自 1 以来的变化,然后它将是一个 UPDATE。
Microsoft 对此有一些很好的文档: https ://learn.microsoft.com/en-us/sql/relational-databases/track-changes/work-with-change-tracking-sql-server?view=sql-server- ver16