我们从客户处收到数据Feed,每次都会获得大致相同的架构,但在客户端使用第三方应用程序时可能会发生变化。当我们收到数据文件时,我们将数据导入到一个临时数据库中,每个数据文件都有一个表(学生,出勤等)。然后,我们希望将该数据与我们已在该客户的数据库中存在的数据进行比较,并查看上一次运行中哪些数据已更改(列已更改或整行可能已删除)。然后,我们要将更新的值或已删除的行写入审计表,以便我们可以返回查看从先前数据导入更改的数据。我们不想更新数据本身,我们只想记录两个数据集之间的不同。然后,我们将从客户数据库中删除所有数据,并在不更改数据的情况下从新数据文件中完全导入数据(此指令已下达且无法更改)。最大的问题是我需要动态地执行此操作,因为我不知道我将从客户那里获得什么模式,因为他们可以对他们的表进行自定义。我需要能够动态确定目标中的表及其结构,然后查看源并比较值以查看数据中的更改。
其他信息: 源上没有ID列,但有几列可以用作构成不同行的代理键。
我希望能够为每个表一般地执行此操作而不必对值进行硬编码,尽管我可能必须为单独的引用表中的每个表的代理键执行此操作。
我可以使用SSIS,SP,触发器等,无论哪个更有意义。我看了很多,包括tablediff,似乎没有我需要的东西,或者一旦我进入它们,逻辑开始变得非常复杂。
当然,任何具有此类事物的具体例子都会非常感谢。
如果有任何其他有用的信息,请告诉我。
由于
答案 0 :(得分:2)
我已经处理过类似的问题,并使用一系列元数据表来动态比较数据集。这些元数据表描述了需要暂存哪些数据集以及哪些列组合(及其数据类型)充当每个表的业务键。
通过这种方式,您可以动态构造一个SQL查询(例如,使用SSIS脚本组件),该查询执行完全外部联接以查找两者之间的差异。
您可以使用SQL Server的元数据(使用sys。*或INFORMATION_SCHEMA。*)加入您自己的元数据,以检测源列中是否仍存在列,数据类型是否与您预期的一样。
将不匹配的元数据重定向到错误流以进行评估。
这种工作方式非常危险,但如果您能很好地维护元数据,就可以完成。
答案 1 :(得分: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中的所有内容。
假设您在两个表上有某种有用的持久主键,两个表中的所有内容都是一个更改。第一组中的所有内容都是插入;第二组中的所有内容都是删除。