由于我在如何使用“$update_mask”字段时遇到了很大的困难(出于性能原因,我不想调用 fn_cdc_is_bit_set),这里是 C# 代码:
- updateMask是 CDC“fn_cdc_get_all_changes_[table]”查询中的“__$update_mask”字段的内容
- colOrdinal是要从中获取更改标志的列的序号(使用“n_cdc_get_column_ordinal”检索此值)
结果是“ hasChanged ”标志。如果字段已在更新中更改,则设置为 true。
请注意,这适用于 SQL Server 2008 和 2012,但可能不适用于未来的版本。
byte[] updateMask = this.UpdateMask;
unchecked
{
byte relevantByte = updateMask[(updateMask.Length - 1) - ((colOrdinal - 1) / 8)];
int bitMask = 1 << ((colOrdinal - 1) % 8);
var hasChanged = (relevantByte & bitMask) != 0;
return hasChanged;
}