我正在尝试验证数据传输过程是否正常运行。我在一个数据库中有源表,在不同的数据库中有目标表。我想验证特定键值的数据传输。
最终我希望以下列格式返回结果:
Table Column Matches
----------------------------
Company Name Y
Company Address Y
Company Phone N
我需要保持列的动态列表,以便在将列添加到其中一个表时此代码不会更改。表格列表是已知的。
现在我正在使用游标。一个循环遍历我需要比较的表的列表,另一个遍历循环通过返回列列表的查询的表。它有效,但我关注性能。我正在检查22个表,可能需要比较表中指定键值的多个记录。因此,比较一个键的所有记录现在实例化30-40个游标。
我觉得应该有一个更好的解决方案,但是在尽可能保持动态的同时找不到任何能够完成工作的东西。
有没有人对我有任何想法?提前谢谢!
答案 0 :(得分:1)
事实证明,我这样做的最快方法是使用C#。我只是将所有要分析的记录拉到C#中的数据表中并从内存中分析它们。对于分析的每个关键值,它将我的总时间减少到2秒以下。这包括以我想要的方式将输出解析为XML。在这一点上,我感觉就像我预期的那样快。感谢大家的建议。
答案 1 :(得分:0)
仅限SQL:您需要从每个数据库的表中提取id和列,并创建排除集并合并它们。然后你可以用count()来判断是否有任何不匹配的东西。
我已经很久没有做过SQL了,但也许这将是足够的伪代码来启动你:
SELECT count(1) from (
(SELECT id, columnname FROM tablename EXCEPT SELECT id, columnname FROM othertable)
UNION
(SELECT id, columnname FROM othertable EXCEPT SELECT id, columnname FROM tablename)
)
你也可以做内连接并比较两次丢失的记录,这会更快但更复杂。
答案 2 :(得分:0)
SQL Server中的迭代非常差,您应尽可能避免使用它们。我宁愿去"关系"。例如,您可以将表格与FULL OUTER JOIN
进行比较,并检查是否有任何密钥为NULL
。显然,如果你添加一列,你必须稍微改变你的查询。
如果你想使用游标,我建议你先阅读并快进,看看你是否获得了一些东西。像这样:
DECLARE C CURSOR FAST_FORWARD FOR
...
...
...