3

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

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

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

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

当然,任何人都已经做过类似的事情的任何具体例子将不胜感激。

让我知道是否有任何其他有用的信息。

谢谢

4

2 回答 2

2

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

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

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

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

这种工作方式风险很大,但如果你维护好你的元数据是可以做到的。

于 2012-04-11T08:14:19.783 回答
1

如果您想比较两个表以查看有什么不同,则关键字是“除外”


select col1,col2,... from table1
except
select col1,col2,... from table2

这为您提供了 table1 中不在 table2 中的所有内容。


select col1,col2,... from table2
except
select col1,col2,... from table1

这为您提供了 table2 中不在 table1 中的所有内容。


假设您在两个表上都有某种有用的持久主键,那么两组中的所有内容都会发生变化。第一组中的所有内容都是插入;第二组中的所有内容都是删除。

于 2012-04-10T19:54:45.487 回答