转换并复制 table 数据
Transform and copy table data
抱歉,如果这个问题之前有人问过,但我发布了它,因为无法在论坛中找到任何相关内容。所以任何帮助将不胜感激。
这是我的场景。
我们有一个 SQL table 视图 A(仅读取访问权限),其数据集位于域 A 的服务器 A 上。
我们的 SQL 数据库和 table B 位于域 B 的服务器 B 上。
我们已经在 2 个域之间打开了端口。
我们需要编写一个 SSIS 作业(每天运行),它将从视图 A 中获取数据并插入到 Table B 中。那么实现此目的的最佳方法是什么。
注:
- table 服务器上的视图没有删除或最后修改的列
所以无法弄清楚有什么变化。 (如果有任何其他方式请告诉我)
- 数据库数据大约有 50k 条记录
方法一:
- 从视图导出数据
- 改造它
- 在服务器 B
上删除 table
- 插入转换后的数据
方法二:
- 从视图中导出数据
- 改造它
- 插入临时文件 table
- 在日志中创建日志条目 table
- 当日志条目显示成功复制时,触发删除所有行并将数据从 temp table 复制到 Table B.
- 如果出现问题,回滚。
我推荐第三种方法,在服务器 B 上的数据库 B 中应用新的暂存 table 和历史记录 table。暂存 table 将主要反映您的 Table B ,但不会包含任何约束,并且会有一个额外的位列定义状态。历史 table 将主要反映 Table B 结构,但将包含两个额外的列(ChangeDate 和 ChangeMade)。最后,对于这种方法,您需要将用于将视图中的记录定义为唯一的列标识出来。
- 截断分期table(根据之前的结果)。
- 将数据从视图(服务器 A)导出到暂存 table(服务器 B)。
- 运行 SQL 检查每条记录的一致性和质量的任务。那些通过的记录,将 Status 位字段值设置为 1,否则设置为 0。
- 在 SQL 任务中应用 MERGE 调用,将数据从源 (Staging table) 转换到目标 table (Table B) 和更新历史 table。这仅适用于 Status = 1 的那些记录。使用 MERGE,您还可以输出已更改内容的历史记录到新的历史记录 table,指示 "I" 用于插入,"U"根据 MERGE 中定义的匹配进行更新或 "D" 删除。
- 对于 Staging table 中值为 0 的那些记录,向需要知道已找到 X 条问题记录的任何人发送电子邮件。
这里的想法是进程不会停止,如果发现单个错误记录,您不需要强制回滚。此外,您可以通过查看暂存 table 来监控日常流程。我过去采用过这种方法并将其集成到发送电子邮件警报中,其中包含指向报告问题记录的 SSRS 报告的链接。这样做让我能够主动在问题记录中找到模式,并与我的上游人员一起解决问题。如果您有超过一百万条记录被视图提取,那么您可能需要向 Staging table 添加一个代理键(设置为主要),其标识从 1 开始,并自动递增 1从视图中导入的每条新记录。在 运行 MERGE 之前,使用代理键设置聚簇索引。这将大大提高 MERGE 的性能。在第一步截断暂存 table 之前,删除索引。
希望对您有所帮助。
只需创建一个包含三个语句的 SQL 存储过程即可实现
- insert -- 用于从 A 到 B 插入新记录
-更新 -- 更新之前复制的记录中发生的更改,因为作业将每天 运行
-delete -- 如果在 A
中删除了任何记录,则删除 B 中所有已删除的记录
如果您需要有关此解决方案的任何说明,我将很高兴
抱歉,如果这个问题之前有人问过,但我发布了它,因为无法在论坛中找到任何相关内容。所以任何帮助将不胜感激。 这是我的场景。
我们有一个 SQL table 视图 A(仅读取访问权限),其数据集位于域 A 的服务器 A 上。 我们的 SQL 数据库和 table B 位于域 B 的服务器 B 上。 我们已经在 2 个域之间打开了端口。
我们需要编写一个 SSIS 作业(每天运行),它将从视图 A 中获取数据并插入到 Table B 中。那么实现此目的的最佳方法是什么。
注:
- table 服务器上的视图没有删除或最后修改的列 所以无法弄清楚有什么变化。 (如果有任何其他方式请告诉我)
- 数据库数据大约有 50k 条记录
方法一:
- 从视图导出数据
- 改造它
- 在服务器 B 上删除 table
- 插入转换后的数据
方法二:
- 从视图中导出数据
- 改造它
- 插入临时文件 table
- 在日志中创建日志条目 table
- 当日志条目显示成功复制时,触发删除所有行并将数据从 temp table 复制到 Table B.
- 如果出现问题,回滚。
我推荐第三种方法,在服务器 B 上的数据库 B 中应用新的暂存 table 和历史记录 table。暂存 table 将主要反映您的 Table B ,但不会包含任何约束,并且会有一个额外的位列定义状态。历史 table 将主要反映 Table B 结构,但将包含两个额外的列(ChangeDate 和 ChangeMade)。最后,对于这种方法,您需要将用于将视图中的记录定义为唯一的列标识出来。
- 截断分期table(根据之前的结果)。
- 将数据从视图(服务器 A)导出到暂存 table(服务器 B)。
- 运行 SQL 检查每条记录的一致性和质量的任务。那些通过的记录,将 Status 位字段值设置为 1,否则设置为 0。
- 在 SQL 任务中应用 MERGE 调用,将数据从源 (Staging table) 转换到目标 table (Table B) 和更新历史 table。这仅适用于 Status = 1 的那些记录。使用 MERGE,您还可以输出已更改内容的历史记录到新的历史记录 table,指示 "I" 用于插入,"U"根据 MERGE 中定义的匹配进行更新或 "D" 删除。
- 对于 Staging table 中值为 0 的那些记录,向需要知道已找到 X 条问题记录的任何人发送电子邮件。
这里的想法是进程不会停止,如果发现单个错误记录,您不需要强制回滚。此外,您可以通过查看暂存 table 来监控日常流程。我过去采用过这种方法并将其集成到发送电子邮件警报中,其中包含指向报告问题记录的 SSRS 报告的链接。这样做让我能够主动在问题记录中找到模式,并与我的上游人员一起解决问题。如果您有超过一百万条记录被视图提取,那么您可能需要向 Staging table 添加一个代理键(设置为主要),其标识从 1 开始,并自动递增 1从视图中导入的每条新记录。在 运行 MERGE 之前,使用代理键设置聚簇索引。这将大大提高 MERGE 的性能。在第一步截断暂存 table 之前,删除索引。
希望对您有所帮助。
只需创建一个包含三个语句的 SQL 存储过程即可实现 - insert -- 用于从 A 到 B 插入新记录 -更新 -- 更新之前复制的记录中发生的更改,因为作业将每天 运行 -delete -- 如果在 A
中删除了任何记录,则删除 B 中所有已删除的记录如果您需要有关此解决方案的任何说明,我将很高兴