为更新操作设置Follying CDC结果集。只有area
字段已更新。 使用CDC或带有CDC的T-SQL跟踪对字段的更改
在前面sreenshot只包含在表中的部分gields。领域更多。时间到了,他们中的一些人更新了一些没有。在下面的查询中,我尝试通过可用视图中的字段来显示更改的统计信息。查询
with History AS (
SELECT
cz.GUID as Id,
cz.category,
isnull(cz.area, 0) as area,
isnull(cz.oilwidthmin,0) as oilwidthmin,
isnull(cz.oilwidthmax,0) as oilwidthmax,
isnull(cz.efectivwidthmin,0) as efectivwidthmin,
isnull(cz.efectivwidthmax,0) as efectivwidthmax,
isnull(cz.koafporistmin,0) as koafporistmin,
isnull(cz.koafporistmax,0) as koafporistmax,
CASE cz.__$operation
WHEN 1 THEN 'DELETE'
WHEN 2 THEN 'INSERT'
WHEN 3 THEN 'Before UPDATE'
WHEN 4 THEN 'After UPDATE'
END operation,
map.tran_begin_time as beginT,
map.tran_end_time as endT
FROM cdc.fn_cdc_get_all_changes_dbo_EXT_GeolObject_KategZalezh(sys.fn_cdc_get_min_lsn('dbo_EXT_GeolObject_KategZalezh'), sys.fn_cdc_get_max_lsn(), 'all') AS cz
INNER JOIN [cdc].[lsn_time_mapping] map
ON cz.[__$start_lsn] = map.start_lsn
)
SELECT field, val, operation, beginT, endT FROM History
unpivot ([val] for field in
(
--category,
area,
oilwidthmin,
oilwidthmax,
efectivwidthmin,
efectivwidthmax,
koafporistmin,
koafporistmax))t where id = '2D166098-7CBD-4622-9EB0-000070506FE6'
我知道CDC按行跟踪更改。或者,也许我错了?如果不是,我如何在SQL中为val
字段做一些比较器。我对t-sql没有深入的了解,我脑子里想到的所有东西都被游标以某种方式使用。有任何想法吗? 也许某种程度上使用CT(更改跟踪)?也许不知何故使用group by
?
几乎正确的答案。如下因素查询返回预期的结果:
WITH History AS (
SELECT
*,
CASE cz.__$operation
WHEN 1 THEN 'DELETE'
WHEN 2 THEN 'INSERT'
WHEN 3 THEN 'Before UPDATE'
WHEN 4 THEN 'After UPDATE'
END operation,
map.tran_begin_time as beginT,
map.tran_end_time as endT
FROM cdc.fn_cdc_get_all_changes_dbo_EXT_GeolObject_KategZalezh(sys.fn_cdc_get_min_lsn('dbo_EXT_GeolObject_KategZalezh'), sys.fn_cdc_get_max_lsn(), 'all') AS cz
INNER JOIN [cdc].[lsn_time_mapping] map
ON cz.[__$start_lsn] = map.start_lsn
where cz.GUID = '2D166098-7CBD-4622-9EB0-000070506FE6'
),
UnpivotedValues AS(
SELECT guid, field, val, operation, beginT, endT
FROM History
UNPIVOT ([val] FOR field IN
(
area,
oilwidthmin,
oilwidthmax,
efectivwidthmin,
efectivwidthmax,
koafporistmin,
koafporistmax
))t
),
UnpivotedWithLastValue AS (
SELECT
*,
--Use LAG() to get the last value for the same field
LAG(val, 1) OVER (PARTITION BY field ORDER BY BeginT) LastVal
FROM UnpivotedValues
)
--Filter out record where the value equals the last value for the same field
SELECT * FROM UnpivotedWithLastValue WHERE val <> LastVal OR LastVal IS NULL ORDER BY guid
但是,如果使用多个GUID的查询时WHERE cz.GUID =
不存在或WHERE
谓我得到如下因素的结果:
此结果为两个GUID。在第一行价值LastVal
必须是16691.像val
从第4行
如果在'WITH历史AS('使用'where cz.id ='some ID'')中,您的示例工作正常,在这种情况下,导致'LastVal'与真实值相对应,但如果'where'包含多个id或'where'不存在,那么'LastVal'的值会混合使用 – Seva
你在使用cz.id的列是什么?这很难回答没有数据样本 – dybzon
对不起,请看看,我补充了我的查询 – Seva