Hi David
I did try several times your demonstration but I couldn't get the stagingCdcContract Table populate with data.
When I run the stored procedure "Exec [dbo].[sPgGetCDCContract] @FromLSNDate=?, @ToLSNDate=?" I get an empty table in return, So I don't know whether I have done something wrong or the stored procedure has an mistake.
Here is the [sPgGetCDCContract] code:
USE [CDCDemo]
GO
/****** Object: StoredProcedure [dbo].[sPgGetCDCContract] Script Date: 11/12/2011 15:43:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sPgGetCDCContract]
@FromLSNDate as datetime,
@ToLSNDate as datetime
AS
begin
SET NOCOUNT ON
SET ROWCOUNT 0
declare @from_lsn binary(10)
declare @to_lsn binary(10)
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @FromLSNDate);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @ToLSNDate);
if (@from_lsn is not null and @to_lsn is not null and @from_lsn < @to_lsn)
begin
DECLARE @name_ordinal int
DECLARE @year_ordinal int
DECLARE @length_ordinal int
DECLARE @type_ordinal int
DECLARE @amount_ordinal int
DECLARE @last_change_id_ordinal int
SET @name_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','name')
SET @year_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','year')
SET @length_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','length')
SET @type_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','type')
SET @amount_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','amount')
SET @last_change_id_ordinal = sys.fn_cdc_get_column_ordinal('dbo_contract','last_change_id')
SELECT cdc.fn_cdc_get_all_changes_dbo_contract.*,
sys.fn_cdc_map_lsn_to_time(__$start_lsn) as 'last_change_date',
cast(isnull(user_name, '') as varchar(100)) as 'last_change_name',
sys.fn_cdc_is_bit_set(@name_ordinal,__$update_mask) as 'IsNameUpdated',
sys.fn_cdc_is_bit_set(@year_ordinal,__$update_mask) as 'IsYearUpdated',
sys.fn_cdc_is_bit_set(@length_ordinal,__$update_mask) as 'IsLengthUpdated',
sys.fn_cdc_is_bit_set(@type_ordinal,__$update_mask) as 'IsTypeUpdated',
sys.fn_cdc_is_bit_set(@amount_ordinal,__$update_mask) as 'IsAmountUpdated',
sys.fn_cdc_is_bit_set(@last_change_id_ordinal,__$update_mask) as 'IsLastChangeIdUpdated'
FROM cdc.fn_cdc_get_all_changes_dbo_contract( @from_lsn, @to_lsn, 'all')
left join Users
on Users.user_id = fn_cdc_get_all_changes_dbo_contract.last_change_id
end
else
begin
-- return empty row
select cdc.dbo_contract_CT.*,
getdate() as 'last_change_date',
'' as 'last_change_name',
cast(0 as bit) as 'IsNameUpdated',
cast(0 as bit) as 'IsYearUpdated',
cast(0 as bit) as 'IsLengthUpdated',
cast(0 as bit) as 'IsTypeUpdated',
cast(0 as bit) as 'IsAmountUpdated',
cast(0 as bit) as 'IsLastChangeIdUpdated'
from cdc.dbo_contract_CT
where __$start_lsn = 0x00000000000000000000
end
end
GO
Thanks