web-dev-qa-db-ja.com

プロシージャまたは関数cdc.fn_cdc_get_all_changes_に指定された引数の数が不十分です

テーブル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
12

このエラーメッセージはやや誤解を招くものであり、基本的に 一部のパラメータが範囲外である可能性があります であることを示唆しています。メッセージはそれ以上カスタマイズされません 制限のため テーブル関数の。

ゼロ値(_0x00000000000000000000_)は有効な値ではありません。 sys.fn_cdc_get_min_lsn()は、適切なキャプチャインスタンス名が見つからない場合、この値を返します。この名前は、実際のテーブル名と異なる場合があります。詳細については、この質問を参照してください

詳細については、 次の質問 を参照してください。

24

上記の答えは正しいですが、私の場合はそれを追加すると思いました。最後に処理されたLSNを将来の実行のために保存していました。しかし、これは開発データベースであり、prodから復元されました。 CDCスクリプトが再適用されましたが、私は自分の歴史を失っていました。最後に処理されたLSNを削除するだけで、キャプチャインスタンスの最小LSNの取得に戻り、正しい軌道に戻ることができました。残念ながら、これは非常に有用なエラーメッセージではありません。

0
LeftOnTheMoon

私の場合、このエラーは、テーブルレベルでCDCを複数回有効/無効にし、同じテーブルに対して2つのキャプチャインスタンスを作成したことが原因でした。データベースレベルでCDCを無効にして再度有効にすることでこれを修正しましたが、正常に機能します。

0
Tej kumar