比较来自不同数据库的两行列

时间:2014-12-10 18:29:10

标签: sql sql-server optimization

我正在尝试验证数据传输过程是否正常运行。我在一个数据库中有源表,在不同的数据库中有目标表。我想验证特定键值的数据传输。

最终我希望以下列格式返回结果:

Table     Column     Matches
----------------------------
Company   Name       Y
Company   Address    Y
Company   Phone      N

我需要保持列的动态列表,以便在将列添加到其中一个表时此代码不会更改。表格列表是已知的。

现在我正在使用游标。一个循环遍历我需要比较的表的列表,另一个遍历循环通过返回列列表的查询的表。它有效,但我关注性能。我正在检查22个表,可能需要比较表中指定键值的多个记录。因此,比较一个键的所有记录现在实例化30-40个游标。

我觉得应该有一个更好的解决方案,但是在尽可能保持动态的同时找不到任何能够完成工作的东西。

有没有人对我有任何想法?提前谢谢!

3 个答案:

答案 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
...
...
...