2011-03-15 62 views
0

我需要檢索多個表的更改數據捕獲行,並且我需要(通過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

你需要使用動態SQL表名稱添加到您的SQL執行前 – Beth

回答

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 
相關問題