Azure ADF 中具有动态源的增量复制 cdc 记录
Posted
技术标签:
【中文标题】Azure ADF 中具有动态源的增量复制 cdc 记录【英文标题】:Incremental copy cdc records with dynamic source in Azure ADF 【发布时间】:2022-01-18 11:40:18 【问题描述】:我在 Azure ADF 中创建了一个管道,用于从我们的源数据库中的 54 个表中复制更改的行。我已按照Azure 的指南进行操作。并对其进行了修改以支持动态表。
我使用查找来获取所有活动的 CDC 表,然后为每个活动在每个 CDC 表上执行副本,并且效果很好。但是当我尝试在 Azure 指南中添加 Trigger_Start_Time 示例代码时,我收到了这个错误:
数据库操作失败并出现以下错误:
''' 附近的语法不正确。' '' 附近的语法不正确。 , SqlErrorNumber=102,Class=15,State=1。
这是我尝试执行的代码示例:
@concat('DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10) ;
SET @begin_time = ''',pipeline().parameters.TriggerStartTime,''';
SET @end_time = ''',pipeline().parameters.TriggerEndTime,''';
SET @from_lsn = sys.fn_cdc_map_time_to_lsn(''smallest greater than or equal'', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn(''largest less than or equal'', @end_time);
SELECT count(1) changecount FROM cdc.fn_cdc_get_net_changes_dbo_@item().Table_Name(@from_lsn, @to_lsn, ''all'')')
我使用@item().Table_Name 来设置表名。如果我将表名硬编码为:“客户”,效果很好
当我在查询中使用源参数时,我错过了什么?
【问题讨论】:
假设你从this section复制你的尝试是不同的。为什么你的代码中有大括号?您链接到的整个页面上都没有。 您好,Azure 的示例仅适用于固定表。所以我改变了它,所以我可以使用动态表。所以我使用 @item().Table_Name 从“For each”活动中获取值。 嗨,您可以尝试将联系人()列表中的项目名称与字符串分开吗?与管道参数相同,例如:@concat('...',item().Table_Name,'...') 【参考方案1】:在 concat() 函数中包含当前项时,将其用作item().Table_Name
。
@concat('DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10) ;
SET @begin_time = ''',pipeline().parameters.TriggerStartTime,''';
SET @end_time = ''',pipeline().parameters.TriggerEndTime,''';
SET @from_lsn = sys.fn_cdc_map_time_to_lsn(''smallest greater than or equal'', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn(''largest less than or equal'', @end_time);
SELECT count(1) changecount FROM cdc.fn_cdc_get_net_changes_dbo_',item().Table_Name,'(@from_lsn, @to_lsn, ''all'')')
管道中的这个查询如下所示,
【讨论】:
以上是关于Azure ADF 中具有动态源的增量复制 cdc 记录的主要内容,如果未能解决你的问题,请参考以下文章
使用 ADF 复制 Azure SQL DW 中的数据(根据文档,使用 Polybase 进行分阶段复制不起作用)
使用 ADF 将 azure blob 文件复制到 azure synapse
Azure 数据工厂 ADF 数据管道将文件名包含在将数据复制到 sql 数据库中