захват изменений данных из многих таблиц с помощью одной хранимой процедуры?

Мне нужно получить строки захвата измененных данных для нескольких таблиц, и мне требуется (в соответствии с ИТ-политикой компании) доступ к базе данных через хранимые процедуры. Я бы предпочел создать одну хранимую процедуру с именем таблицы в качестве параметра, а не одну хранимую процедуру для каждой таблицы, которую я отслеживаю. Что меня задевает, так это то, что 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

person Eric    schedule 15.03.2011    source источник
comment
вам нужно будет использовать динамический sql, чтобы добавить имя таблицы в ваш sql перед его выполнением.   -  person Beth    schedule 15.03.2011


Ответы (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
person malinois    schedule 15.03.2011