テーブルFields
で追跡された最新の変更をクエリするための、一見有効なコード:
DECLARE @Begin_LSN BINARY(10), @End_LSN BINARY(10)
SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields')
SET @End_LSN = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_ordering_Fields (@Begin_LSN, @End_LSN, N'all')
GO
次のエラーメッセージが生成されます。
Msg 313, Level 16, State 3, Line 5
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ... .
ただし、実際の値を確認すると、それらはすべて有効(nullではない)のように見えます。
SELECT @Begin_LSN, @End_LSN, N'all';
戻り値
0x00000000000000000000 0x00002594000002130001 all
このエラーメッセージはやや誤解を招くものであり、基本的に 一部のパラメータが範囲外である可能性があります であることを示唆しています。メッセージはそれ以上カスタマイズされません 制限のため テーブル関数の。
ゼロ値(_0x00000000000000000000
_)は有効な値ではありません。 sys.fn_cdc_get_min_lsn()
は、適切なキャプチャインスタンス名が見つからない場合、この値を返します。この名前は、実際のテーブル名と異なる場合があります。詳細については、この質問を参照してください
詳細については、 次の質問 を参照してください。
上記の答えは正しいですが、私の場合はそれを追加すると思いました。最後に処理されたLSNを将来の実行のために保存していました。しかし、これは開発データベースであり、prodから復元されました。 CDCスクリプトが再適用されましたが、私は自分の歴史を失っていました。最後に処理されたLSNを削除するだけで、キャプチャインスタンスの最小LSNの取得に戻り、正しい軌道に戻ることができました。残念ながら、これは非常に有用なエラーメッセージではありません。
私の場合、このエラーは、テーブルレベルでCDCを複数回有効/無効にし、同じテーブルに対して2つのキャプチャインスタンスを作成したことが原因でした。データベースレベルでCDCを無効にして再度有効にすることでこれを修正しましたが、正常に機能します。