sql - 如何在 SQL Server 中动态比较源表和目标表中的行

标签 sql sql-server tsql ssis

我们收到来自客户的数据馈送,每次我们都获得大致相同的架构,尽管它可能会在客户端发生变化,因为他们正在使用第 3 方应用程序。当我们收到数据文件时,我们将数据导入到一个临时数据库中,每个数据文件(学生、出勤等)都有一个表。然后,我们想要将该数据与我们已经存在于数据库中的该客户的数据进行比较,并查看上次运行中哪些数据发生了变化(列发生了变化或者整行可能被删除)。然后,我们希望将更新的值或删除的行写入审计表,以便我们可以返回查看从上次数据导入中更改了哪些数据。我们不想更新数据本身,我们只想记录两个数据集之间的不同之处。然后,我们将从客户数据库中删除所有数据,并从新数据文件中完全原封不动地导入数据(该指令已下达,无法更改)。最大的问题是我需要动态地执行此操作,因为我不知道我将从客户那里得到什么模式,因为他们可以对他们的表进行自定义。我需要能够动态确定目标中有哪些表及其结构,然后查看源并比较值以查看数据中发生了什么变化。

附加信息: 源上没有 ID 列,但有几列可用作构成不同行的代理键。

我希望能够对每个表通用地执行此操作,而不必在其中硬编码值,尽管我可能必须在单独的引用表中为每个表的代理键执行此操作。

我可以使用 SSIS、SP、触发器等,以更有意义的为准。我已经查看了所有内容,包括 tablediff,但似乎没有一个包含我需要的一切,或者一旦我进入它们,逻辑就开始变得极其复杂。

当然,如果任何人有他们已经做过的类似事情的任何具体例子,我们将不胜感激。

如果有任何其他有用的信息,请告诉我。

谢谢

最佳答案

我曾处理过类似的问题,并使用一系列元数据表来动态比较数据集。这些元数据表描述了哪些数据集需要暂存以及哪些列组合(及其数据类型)用作每个表的业务键。

通过这种方式,您可以动态构建 SQL 查询(例如,使用 SSIS 脚本组件)来执行完整的外部联接以查找两者之间的差异。

您可以将您自己的元数据与 SQL Server 的元数据(使用 sys.* 或 INFORMATION_SCHEMA.*)结合起来,以检测源中是否仍然存在列以及数据类型是否符合您的预期。

将不匹配的元数据重定向到错误流以进行评估。

这种工作方式风险很大,但如果您妥善维护元数据,则可以做到。

关于sql - 如何在 SQL Server 中动态比较源表和目标表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10094981/

相关文章:

MySQL IF 返回多个值?

sql - COUNT SQL 函数的性能

sql-server - 如何通过累积连接获取 SQL 中字符串值的分组

sql-server - ALTER TABLE 语句与 FOREIGN KEY 约束冲突

sql - 为什么在 'month' 中使用 'where' 时 SQL Server 返回不同的顺序?

xml - 在 SQL Server 中解析 XML 的问题

sql - Vertica 比较表内容

Mysql 不等于运算符失败?

ASP.NET SqlServer session 复制

sql - 如何截去小数位而不向上舍入?