2013-03-20 53 views
5

我试图通过传递最小和最大日期来获取启用CDC的表上的净更改。但抛出低于错误。更改数据捕获错误

Msg 313, Level 16, State 3, Line 24 
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_net_changes_ ... . 

我的代码如下:

DECLARE @CDate DATE = '2013-03-18' --This is the date after the CDC was enabled on the table 
DECLARE @count INT; 
DECLARE @lsnStartDatetime DATETIME; 
DECLARE @lsnEndDateTime DATETIME; 

DECLARE @begin_time DATETIME , 
@end_time DATETIME , 
@from_lsn BINARY(10) , 
@to_lsn BINARY(10); 


SELECT @lsnStartDatetime = CAST(CAST(@CDate AS NVARCHAR(10)) + ' 00:00:00' AS DATETIME) 
SELECT @lsnEndDateTime = CAST(CAST(@CDate AS NVARCHAR(10)) + ' 23:59:59' AS DATETIME) 


SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', 
             @lsnStartDatetime); 
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', 
            @lsnEndDateTime); 

if exists (select * from sys.objects where name = 'EmployeeCDCbyDate' and type = 'u') 
drop table etl.EmployeeCDCbyDate 
SELECT * 
FROM cdc.fn_cdc_get_net_changes_employee(@from_lsn, @to_lsn, N'all') 

难道是from_lsn和to_lsn从sys.fn_cdc_map_time_to_lsn犯规配以映射aginst CDC表 '员工'

下面的代码作品获得精细;但它会从min max lsn's中获得所有净变化。

DECLARE @min_lsn BINARY(10) = sys.fn_cdc_get_min_lsn ('employee') 
DECLARE @max_lsn BINARY(10) = sys.fn_cdc_get_max_lsn() 
SELECT * FROM cdc.fn_cdc_get_net_changes_employee(@min_lsn, @max_lsn, 'all') ORDER BY 1 desc 

我需要的是获得给定日期的cdc实例的最小和最大lsn并获得该日期的净变化。任何线索?

编辑:

当我在一堆表使这正常工作与第一个表。

例:

USE ERP 

EXEC sys.sp_cdc_disable_db 
EXEC sys.sp_cdc_enable_db 

EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', 
@source_name = N'Employee', 
@capture_instance = 'Employee', 
@supports_net_changes =1, 
@role_name = NULL 

EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', 
@source_name = N'StoreListing', 
@capture_instance = 'StoreListing', 
@supports_net_changes =1, 
@role_name = NULL 

Go 

这正常工作与Employee表。如果我更改CDC启用的顺序(如果我先将商店列表和员工下一个),那么它可以在员工列表中正常工作。

回答

1

MSDN Social上有类似问题的答案:Is there bug with cdc.fn_cdc_get_net_changes_.... in SQL Server 2012

它被标记为由主持人回答。这里是引用:

我在我的服务器上测试过。当我在SQL Server 2008 R2中运行脚本时,它可以成功运行而不会出错。

当我在SQL Server 2012中运行脚本时,错误消息与您的一样。我想你可以尝试应用最新的SQL Server 2012 Service Pack来查看它是否可以。

And here is a bug report with Microsoft.正在调查中。

+0

这些都在MSDN论坛和连接是我的帖子虽然:-) 。我期待是否有人想出了替代方法来做到这一点。 – Sreedhar 2013-05-28 07:37:21

+0

对不起。我应该比较代码。 Edit中的代码适用于第一个表格 - 是否适用于其他表格? – Stoleg 2013-05-28 08:01:23