更改数据捕获错误

时间:2013-03-20 01:42:29

标签: sql-server sql-server-2012 cdc change-data-capture

我试图通过传递最小和最大日期来获取启用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')

来自sys.fn_cdc_map_time_to_lsn的from_lsn和to_lsn是否与cdc表'employee'的映射不匹配

下面的代码工作正常;但它从min max lsn获得所有净变化。

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实例的min和max 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的顺序(如果我先将商店列表放在第一位,然后是员工,那么它适用于员工列表。

2 个答案:

答案 0 :(得分: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.正在调查中。

答案 1 :(得分:0)

我收到此消息,原因是因为我有我的Start LSN和Ending LSN号码

我更详细地回答了https://stackoverflow.com/a/30920333/98802