我需要检索多个表的更改数据捕获行,并且我需要(通过公司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
答案 0 :(得分:0)
我认为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