Untuk menemukan daftar kolom dan data yang diperbarui menggunakan CDC

Saya membuat pengaturan untuk memelihara tabel dengan data historis menggunakan CDC. Di bawah ini adalah skrip yang saya tulis:

create table dbo.Name (ID int not null primary key clustered identity(1,1),
Col1 nvarchar(50) not null constraint DF_Col1 default 'Unknown',
Col2 nvarchar(50) not null constraint DF_Col2 default 'Unknown',
Col3 nvarchar(50) not null constraint DF_Col3 default 'Unknown',
Col4 nvarchar(50) not null constraint DF_Col4 default 'Unknown',
Col5 nvarchar(50) not null constraint DF_Col5 default 'Unknown',
CreatedDate DATETIME NOT NULL DEFAULT(GETDATE()),
ModifiedDate DATETIME 
)
GO

exec sys.sp_cdc_enable_db
go
exec sys.sp_cdc_enable_table @source_schema = N'dbo',
@source_name = N'Name',
@capture_instance = 'Name', 
@supports_net_changes = 1, 
@role_name = NULL
GO

INSERT INTO dbo.Name 
VALUES('A','B','C','D','E',GETDATE(),NULL),
('F','G','H','I','J',GETDATE(),NULL),
('K','L','M','N','O',GETDATE(),NULL)
GO

SELECT * FROM cdc.Name_CT

UPDATE Name
SET Col1 = Col1 + '_U', ModifiedDate = GETDATE()
WHERE id = 1

UPDATE Name
SET Col2 = Col2 + '_V', ModifiedDate = GETDATE()
WHERE id = 2 

UPDATE Name
SET Col3 = Col3 + '_A', Col4 = Col4 + '_B', ModifiedDate = GETDATE()
WHERE id = 3
GO

SELECT * FROM cdc.Name_CT

Skrip di atas akan mengembalikan nilai kolom yang datanya telah diubah. Saya mencari output di bawah ini yaitu kolom FieldName akan berisi daftar kolom tempat data diperbarui dan kolom nilai akan berisi nilai sebelumnya dan nilai baru. Nilai CreatedDate akan menjadi StartDate dari baris sebelum update dan ModifiedDate akan menjadi EndDate dari baris sebelum update dan StartDate dari baris setelah update.

ID    FieldName    Value    StartDate                 EndDate
=================================================================
1     Col1         A        2014-08-18 15:56:08       2014-08-18 15:59:44
1     Col1         A_U      2014-08-18 15:59:44       NULL
2     Col2         G        2014-08-18 15:56:08       2014-08-18 15:59:44
2     Col2         G_V      2014-08-18 15:59:44       NULL
3     Col3         M        2014-08-18 15:56:08       2014-08-18 15:59:44
3     Col3         M_A      2014-08-18 15:59:44       NULL
3     Col4         N        2014-08-18 15:56:08       2014-08-18 15:59:44
3     Col4         N_B      2014-08-18 15:59:44       NULL

person whywake    schedule 18.08.2014    source sumber


Jawaban (2)


Saya memeriksa permintaan Anda di tabel saya dan saya bisa mendapatkan hasil untuk baris yang sama diperbarui beberapa kali.

With Cte_CDC as (SELECT ID,FieldName,FieldValue,StartDate=CreatedDate,EndDate 

=ModifiedDate
from 
(
Select ID,Col1,Col2,Col3,Col4,Col5,CreatedDate,ModifiedDate 
FROM cdc.mssqlserver2012_ct
) a
Unpivot
(
FieldValue for FieldName in (Col1,Col2,Col3,Col4,Col5)
) Upt)


select distinct a.ID,a.FieldName,a.FieldValue,ISNULL(a.EndDate,a.StartDate) as Startdate,b.EndDate
from Cte_CDC a
join Cte_CDC b on a.ID=b.ID and a.FieldName=b.FieldName and a.FieldValue<>b.FieldValue
order by 1,2

ID  FieldName   FieldValue  Startdate   EndDate
1   Col1    A   2014-08-20 15:09:40.560 2014-08-20 15:11:34.863
1   Col1    A   2014-08-20 15:09:40.560 2014-08-20 15:12:46.117
1   Col1    A   2014-08-20 15:09:40.560 2014-08-20 15:18:15.973
1   Col1    A_U 2014-08-20 15:11:34.863 NULL
1   Col1    A_U 2014-08-20 15:11:34.863 2014-08-20 15:12:46.117
1   Col1    A_U 2014-08-20 15:11:34.863 2014-08-20 15:18:15.973
1   Col1    A_U_UV  2014-08-20 15:12:46.117 NULL
1   Col1    A_U_UV  2014-08-20 15:12:46.117 2014-08-20 15:11:34.863
1   Col1    A_U_UV  2014-08-20 15:12:46.117 2014-08-20 15:18:15.973
1   Col1    A_U_UV_UVX  2014-08-20 15:18:15.973 NULL
1   Col1    A_U_UV_UVX  2014-08-20 15:18:15.973 2014-08-20 15:11:34.863
1   Col1    A_U_UV_UVX  2014-08-20 15:18:15.973 2014-08-20 15:12:46.117
2   Col2    G   2014-08-20 15:09:40.560 2014-08-20 15:11:34.877
2   Col2    G_V 2014-08-20 15:11:34.877 NULL
3   Col3    M   2014-08-20 15:09:40.560 2014-08-20 15:11:34.877
3   Col3    M_A 2014-08-20 15:11:34.877 NULL
3   Col4    N   2014-08-20 15:09:40.560 2014-08-20 15:11:34.877
3   Col4    N_B 2014-08-20 15:11:34.877 NULL

Jika Anda masih belum mengerti, cukup periksa ulang tabel pelacakan Anda apakah tabel tersebut terisi dengan benar atau tidak untuk setiap pembaruan dan verifikasi argumen Anda untuk mengaktifkan cdc untuk tabel Anda.

person ram_sql    schedule 20.08.2014

Saya pikir dengan menggunakan fungsi pivot pada tabel cdc.Name_CT, Anda bisa mendapatkan struktur keluaran yang Anda inginkan.

person ram_sql    schedule 18.08.2014