2013-06-26 84 views
0

我收到此錯誤 嘗試執行以下SQL查詢時出現「爲過程或函數cdc.fn_cdc_get_all_changes_提供的參數數量不足」。執行更改數據捕獲sql查詢時出錯

use SpatialDB 
go 
declare @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10); 
set @begin_time=GETDATE()-1; 
set @end_time=GETDATE(); 
set @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time); 
set @to_lsn=sys.fn_cdc_map_time_to_lsn('largest greater than or eqaul', @end_time); 
select * from cdc.fn_cdc_get_net_changes_dbo_Points(@from_lsn, @to_lsn, N'all'); 
go 

回答

0

mecdc.fn_cdc_get_net_changes_dbo_Points需要更多參數。找到這個函數的定義,看看它的期望是什麼,這樣你就可以給它正確的參數。這是你的職能之一,所以我們都不知道論據應該是什麼。

0

晚了,但爲了未來的求職者。 。 。

錯誤消息有點誤導。你傳遞給函數的參數需要是「有效的」,否則你會得到這個令人沮喪的錯誤信息。

以下是來自TechNet for SQL Server 2008文章Using Change Data的引用。我建議你閱讀這篇文章。

我們建議在使用前驗證要在TVF查詢中使用的LSN邊界。在捕獲實例的有效間隔外部存在 的空端點或端點將強制更改數據捕獲TVF返回 錯誤。

例如,如果用於定義查詢間隔的參數 無效或超出範圍,或者行篩選器選項無效,則針對所有 更改的查詢返回以下錯誤。

消息313,級別16,狀態3,第1行

的過程或 功能cdc.fn_cdc_get_all_changes_被提供的參數數量不足......對於一個淨變化返回

相應的錯誤查詢是 以下:

消息313,級別16,狀態3,1

線的參數的數目不足的方法O供給[R 功能cdc.fn_cdc_get_net_changes_ ...

當我在SQL Server 2012中使用這些功能的第一次開始,我經過在遠已被由CDC捕獲日期範圍之外的野外參數。當我清理它們時 - 也就是開始使用有效的日期範圍 - 遵循的結果很好。

0

更晚,但爲未來的求職者。 。 。

我收到此消息,原因是因爲我已經切換了我的開始LSN和結束LSN號碼。所以,我把它們切換回來,它運行良好。

我結束了這樣的代碼:

SELECT DISTINCT sh.siteid1 AS 'Site Number' ,CASE cdc.__$operation WHEN 1 THEN 'D' WHEN 2 THEN 'I' WHEN 4 THEN 'U' END AS CDC_OPERATION FROM site_header sh(NOLOCK) INNER JOIN cdc.fn_cdc_get_net_changes_dbo_svt_svsiteheader(0x00004B04000019300002, 0x00004B0500003A220001, N'All') cdc ON cdc.site_id = sh.site_id LEFT JOIN site_location sl ON sh.id_site = sl.id_site AND sh.primary_id = sl.id_rec

0

我有同樣的問題,傑拉爾德是現貨 - 如果我的範圍內使用的LSN的C​​DC捕獲的數據,沒有任何問題。

我現在封蓋我的LSN值與sys.fn_cdc_get_min_lsn('my_captureinstance')sys.fn_cdc_get_max_lsn(),e.g:

DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10), @min_lsn BINARY(10), @max_lsn BINARY(10); 

SET @begin_time = '2015-06-23 00:00:00.000'; 
SET @end_time = '2015-06-24 00:00:00.000'; 

SELECT @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin_time); 
SELECT @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time); 

SELECT @min_lsn = sys.fn_cdc_get_min_lsn('my_captureinstance') 
SELECT @max_lsn = sys.fn_cdc_get_max_lsn() 

IF @begin_lsn < @min_lsn BEGIN 
    SELECT @begin_lsn = @min_lsn 
END 

IF @end_lsn > @max_lsn BEGIN 
    SELECT @end_lsn = @max_lsn 
END 

SELECT * FROM cdc.fn_cdc_get_net_changes_my_captureinstance(@begin_lsn, @end_lsn, 'all')