【发布时间】:2015-03-04 16:21:11
【问题描述】:
由于我在如何使用“$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;
}
【问题讨论】:
-
我会将其重新格式化为一个问题,然后将您的问题的答案放在下面。可以回答您自己的问题。
-
顺便说一句,我在 clr 中使用了您的方法来返回以逗号分隔的字符串更改的列名。效果很好。 dba.stackexchange.com/questions/35936/…
标签: sql-server cdc