sql-server - 查找并加载相关表/数据以从 ADF 中的 SQL Server 数据库移动

标签 sql-server azure azure-data-factory

我面临以下问题: 数据科学系的一位同事建立了一个 ADF 管道,它将数据从我们的生产数据库复制到我们的开发数据库中。 为了避免相关数据和写入权限出现错误,生产环境中的数据存储在开发数据库中新创建的模式“stg”中。出于大小原因,仅复制每个表的前 1000 个条目。数据应存储在带有所有约束和外键的“dbo”模式的末尾。从 stg 模式中的表到 dbo 模式的复制是通过仅存在于开发数据库中的存储过程来解决的。到目前为止,管道工作正常。 但是,当涉及从一种模式复制到另一种模式时,我会遇到外键关系错误。这是因为不确定表 A 的前 1000 个条目是否链接到表 B 的前 1000 个条目。表 A 的 X 链接到表 B 中的条目 1000 + Y。 我的问题:是否有任何简单的解决方案可以在 ADF 管道中解决此问题,或者我是否必须编写一些 SQL 代码来从管道中的所有相关表中获取所有相关数据?

这是我们管道的图片: Pipeline:首先搜索所有表,然后循环遍历所有条目并获取前 1000 个条目并将它们存储到目标数据库中

这是我们的查找代码

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE table_type = 'BASE TABLE' and TABLE_SCHEMA ='dbo' and TABLE_CATALOG ='[database name]'

这样我们就可以从查找给出的表中提取前 1000 行(在复制事件中):

@concat('select top 1000 * from  ', ' dbo.',item().TABLE_NAME)

到目前为止,我们尝试扩大 SELECT 语句中的结果集或添加一些排序算法,但这两次尝试都以缺少外键的相同错误结束。

最佳答案

没有直接的方法可以从 ADF 中的所有表中仅复制相关数据。为此,以下是方法

  • 首先,将父/基表的 1,000 条记录从生产环境复制到开发环境数据库。
  • 然后,创建一个查找表并按层次顺序存储表名称列表,以便预先复制所有依赖表。
  • 进行查找事件并将查找表用作数据集。

示例查找表

<表类=“s-表”> <标题> 订单 表 相关表 Lookup_Query 复制源查询 <正文> 1 子表1 父表1 从parent_table1中选择不同的fk_childtable1 SELECT * FROM 部门 WHERE dept_id IN (@{variables('arrayvar1')}) 2 子表2 子表1 从 child_table1 中选择不同的 fk_childtable2 从员工中选择 * WHERE dept_id IN (@{variables('arrayvar1')})
  • 使用 for-each 事件并检查设置中的顺序选项。
  • 在 for-each 事件中,获取查找事件并使用开发环境数据库作为查找事件源数据集。
  • 提供查找表中的查询(字段名称:Lookup_query),以从查找事件中获取依赖父表中的值列表。
  • 将查找事件输出转换为数组。引用this StackOverflow thread这样做。
  • 进行复制事件,并在源设置中提供查询以从查找事件数组中可用的生产环境中获取数据。

关于sql-server - 查找并加载相关表/数据以从 ADF 中的 SQL Server 数据库移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76818942/

相关文章:

azure - 如何在 Spring Boot 中为 CosmosDb 设置分区键

sql-server - 使用 LogParser 将 SharePoint 使用日志文件导出到数据库中

java - SQLServer - 确定列是几何列还是地理列

C# - SQLClient - 最简单的 INSERT

powershell - 如何从 Azure 数据工厂运行 PowerShell

Azure 数据工厂 - 将查找事件输出复制到 blob 中的 json

Azure 数据流-源查询下推

sql-server - 检查字符串是否不包含另一个字符串

azure - Visual Studio 2015 Azure ADFS

linux - 用于复制文件、重命名并将其共享到 azure blob 的脚本