2

「$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;
        }
4

3 に答える 3

0

これについて100%確信はありませんが、おそらくの値はトリガー内$update_maskで返される値です。COLUMNS_UPDATED()その値を解釈する方法の詳細については、http://msdn.microsoft.com/en-us/library/ms186329.aspxを参照してください。

于 2013-01-30T15:36:07.247 に答える
0

私も同じ問題を抱えていました。関数 sys.fn_cdc_is_bit_set を複数回呼び出すプロシージャがあり、そのプロシージャをコンパイルするのに数分かかり、実行も非常に遅くなりました。関数 sys.fn_cdc_is_bit_set を手動マスク解析に置き換えると、はるかに高速に動作します。case when substring([ $update_mask],len([ $update_mask]) - (([ColumnOrder]-1)/8),1) & power(2,([ColumnOrder]-1)%8) > 0 then 1そうでなければ0終了

于 2015-03-04T08:21:11.770 に答える