【发布时间】:2016-11-18 10:02:55
【问题描述】:
我使用的是 SQL Server 2012 标准版,并且我在一个表上激活了更改跟踪功能。
当我使用 CHANGETABLE 函数列出表上的更改时,我有一个带有二进制数据的 SYS_CHANGE_COLUMNS 属性
0x0000000045000000460000004700000048000000
我如何知道哪些列发生了变化?
【问题讨论】:
标签: sql-server change-tracking
我使用的是 SQL Server 2012 标准版,并且我在一个表上激活了更改跟踪功能。
当我使用 CHANGETABLE 函数列出表上的更改时,我有一个带有二进制数据的 SYS_CHANGE_COLUMNS 属性
0x0000000045000000460000004700000048000000
我如何知道哪些列发生了变化?
【问题讨论】:
标签: sql-server change-tracking
因为列是由所有已更改列的列 ID 组成的位掩码,所以很难知道它是由什么组成的。其实MSDN说这里不要直接询问SYS_CHANGE_COLUMNS:https://msdn.microsoft.com/en-us/library/bb934145.aspx
不应直接解释此二进制值。
但是,当您为了通知目的而检测更改时,通知使用者通常很清楚他们有兴趣更改哪些列。
对于这个用例,使用CHANGE_TRACKING_IS_COLUMN_IN_MASK 函数。
-- Get the column ID of my column
declare @MyColumnId int
set @MyColumnId = columnproperty(object_id('MyTable'), 'MyColumn', 'ColumnId')
-- Check if it's changed
declare @MyColumnHasChanged bit
set @MyColumnHasChanged = CHANGE_TRACKING_IS_COLUMN_IN_MASK (MyColumnId, @change_columns_bitmask);
如果 CHANGE_TRACKING_IS_COLUMN_IN_MASK 告诉我列是否已更改, 如何编写一个脚本来告诉我哪些列已更改?一世 每个表有大约 50 个属性。
恐怕您需要遍历所有您可能感兴趣的列...如果这过于严格,您可能必须使用另一种更改通知方法,例如 Change Data Capture (CDC) , 或触发器
【讨论】: