【问题标题】:change-data-capture from many tables via a single stored procedure?通过单个存储过程从多个表中更改数据捕获?
【发布时间】:2011-03-15 16:13:16
【问题描述】:

我需要检索多个表的更改数据捕获行,并且(公司 IT 政策)要求我通过存储过程访问数据库。我宁愿创建一个以表名作为参数的存储过程,而不是为我正在监视的每个表创建一个存储过程。我感到困惑的是,CDC 为每个受监控的表定义了一个单独的表值函数名称,我不确定如何最好地概括这一点。

是否可以修改以下示例代码,使其调用cdc.fn_cdc_get_net_changes_dbo_ + @Table 而不是cdc.fn_cdc_get_net_changes_dbo_TABLE

我应该使用其他方法吗?

create proc [dbo].GetChangesForTable
 @Table varchar(50),
 @BeginTime datetime,
 @EndTime datetime
as
begin

    DECLARE @begin_lsn binary(10), @end_lsn binary(10); 
    DECLARE @func nvarchar(128)

    if @EndTime is null select @EndTime=GETDATE()

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

     -- HOW TO GET THE CORRECT FUNCTION CALLED HERE?        
    SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_TABLE(@begin_lsn, @end_lsn, 'all')

end
GO

【问题讨论】:

  • 你需要使用动态sql在执行前将表名添加到你的sql中

标签: sql sql-server-2008 change-data-capture


【解决方案1】:

我认为 sp_executesql 可以这样:

DECLARE @sql nvarchar(4000)
    SET @sql = N'SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_'+cast(@TABLE as varchar)+'(@begin_lsn, @end_lsn, 'all')'


EXEC sp_executesql @sql, N'@Table varchar(50), @BeginTime datetime, @EndTime datetime',@Table,@BeginTime,@EndTime

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多