比较和报告两个数据库之间的不同数据

本文关键字:之间 数据库 数据 两个 报告 比较 | 更新日期: 2023-09-27 18:32:43

我的应用程序的数据库包含我的应用程序运行所必需的表(用户无法编辑(。 例如,有一个报告表,其中包含我的 SSRS 报告列表。

除了"自动增量"和"GUID"字段之外,报告表中的数据应在所有数据库中匹配。

为了使现有客户端数据库

与从头开始创建的数据库保持同步,有一个数据库更新程序应用程序,该应用程序运行脚本来更新现有客户端群。

有单元测试来确保报表在两种类型的数据库上正确运行。 但是,除了开发人员之外,没有系统检查来确保这些行中的行和值在表中匹配。 这很容易出现人为错误。

为了解决这个问题,我计划在单元测试报告中添加一个小报告,它将为以下内容的开发提供信息:

  1. "从头开始"数据库中缺少的记录,而"更新的"数据库中存在
  2. "从头开始制作"数据库中存在的"更新"数据库中缺少的记录
  3. 表之间不匹配的字段

到目前为止,我有一个查询来报告所有涉及的表的上述信息。

示例查询如下所示:

--Take the fields I want to compare from TableToCompare in MadeFromScratch and put them in @First_Table_Var
--NOTE:  MyFirstField should match in both tables in order to compare the values between rows
DECLARE @First_Table_Var table(
    MyFirstField Varchar(255),
    MySecondField VarChar(255),
    MyThirdField Varchar(255),
    );
INSERT INTO @First_Table_Var
    SELECT
        r.MyFirstField,
        r.MySecondField,
        l.MyThirdField
    FROM
        MadeFromScratch.dbo.TableToCompare r
            INNER JOIN  MadeFromScratch.dbo.LookUpTable l ON r.ForeignKeyID = l.PrimaryKeyID

--Take the fields I want to compare from TableToCompare in UpdatdDatabase and put them in @Second_Table_Var
DECLARE @Second_Table_Var table(
    MyFirstField Varchar(255),
    MySecondField VarChar(255),
    MyThirdField Varchar(255),
    );
INSERT INTO @Second_Table_Var
    SELECT
        r.MyFirstField,
        r.MySecondField,
        l.MyThirdField
    FROM
        UpdatdDatabase.dbo.TableToCompare r
            INNER JOIN  UpdatdDatabase.dbo.LookUpTable l ON r.ForeignKeyID = l.PrimaryKeyID
--**********************
--   CREATE OUTPUT
--**********************
--List Rows that exist in @Second_Table but not @First_Table
--(e.g. these rows need to be added to the table in MadeFromScratch)
SELECT 
    Problem = '1 MISSING ROW IN A MADE-FROM-SCRATCH DATABASE',
    hur.MyFirstField,
    hur.MySecondField,
    hur.MyThirdField
FROM 
    @Second_Table_Var hur
WHERE
    NOT EXISTS
    (SELECT 
        *
     FROM 
        @First_Table_Var hu 
     WHERE
        hu.MyFirstField = hur.MyFirstField
    )
UNION
--List Rows that exist in @First_Table but not @Second_Table
--(e.g. these rows need to be added to the table in UpdatdDatabase)
SELECT 
    Problem = '2 MISSING IN UPDATE DATABASE',
    hur.MyFirstField,
    hur.MySecondField,
    hur.MyThirdField
FROM 
    @First_Table_Var hur
 WHERE 
    NOT EXISTS
    (SELECT 
        * 
     FROM
        @Second_Table_Var hu 
     WHERE
        hu.MySecondField = hur.MySecondField 
    )
UNION   
--Compare fields among the tables where MyFirstField matches, but 
SELECT 
    Problem = '3 MISMATCHED FIELD',
    h.MyFirstField,
    MySecondField = CASE WHEN h.MySecondField = hu.MySecondField    THEN '' ELSE 'Created Value:  ' + h.MySecondField                       + '  Updated Value:  '  + hu.MySecondField                  END,
    MyThirdField    = CASE WHEN h.MyThirdField = hu.MyThirdField        THEN '' ELSE 'Created Value:  ' + CAST(h.MyThirdField AS VARCHAR(4))    + '  Updated Value:  '  + CAST(hu.MyThirdField AS VARCHAR(4))   END,
 FROM
    @First_Table_Var h
        INNER JOIN @Second_Table_Var hu on h.MyFirstField  = hu.MyFirstField
 WHERE 
    NOT EXISTS
    (SELECT 
        *
     FROM
        @Second_Table_Var hu 
     WHERE
        hu.MyFirstField = h.MyFirstField and 
        hu.MySecondField = h.MySecondField and
        hu.MyThirdField = h.MyThirdField and
    )
ORDER BY Problem 

编写代码来解析结果不会有任何问题,但由于以下原因,这种方法感觉过时了:

  1. 需要编写几个查询(本质上做同样的事情(
  2. 此过程的维护可能会很麻烦

我希望能够编写一些东西,其中要比较的表和字段列表由某种文件(XML? 因此,无论添加字段还是更改字段,用户所要做的就是更新此文件。

有没有办法使用 LINQ 和/或反射(或 .NET 4.0 中的任何功能(,我可以比较两个数据库之间的表并像上面列出的那样维护它们?

欢迎提出想法。 有例子的想法会很棒!:D

比较和报告两个数据库之间的不同数据

您说"除了"自动增量"和"GUID"字段之外,报告表中的数据应在所有数据库中匹配。

我假设这些字段是 ID 字段,理想情况下,数据库的复制也应该复制 id 字段,确保这将允许您按 ID 检查新插入,如果更新,您可以设置时间戳字段进行比较。