SQL数据对比 - 一些表丢失

22

通过VS 2013专业版使用SQL Server数据工具进行数据比较时,我遇到了一种情况,其中一些表似乎被忽略了。

我的意思是在源服务器上的TableA中有数据,但在目标服务器上的相应表中没有数据。

然而,结果窗口甚至没有显示TableA的行。

此外,如果在按下“完成”之前尝试在下一步中过滤结果,则TableA不会出现为可供过滤的选项。就好像该表在目标服务器上不存在一样。 我已经验证了:

  • 通过SSMS连接并查看表列表
  • 运行SELECT * FROM information_schema.tables

在这两种情况下,我都可以看到该表被列出。

有没有其他人遇到过这种情况?我错过了什么吗?


只有当您知道要比较哪些表中的记录时,才能比较数据。Compareer使用PK来确定要比较的记录。如果您的表没有PK(或至少有一个唯一索引),它将从表列表中缺失。 - jean
谢谢Jean,那就是问题所在。我正在使用别人提供的数据库,并没有注意到这个表上没有主键(实际上还有其他几个表也有同样的问题)。请将您的评论作为答案添加,我会接受它。 - lee_mcmullen
2个回答

34

只有当你知道要比较哪些表的记录时,才能进行数据比较。Comparer使用PK来确定要比较哪些记录。如果你的表没有主键(或者至少有一个唯一索引),它将在表列表中缺失。

你可以通过自己创建一个主键(仅用于比较)来解决这个问题。

编辑

  1. 最近有位同事因为有人明确地从比较项目中排除了一些表并提交到git而遭受了困扰。所以如果不是一个新项目,请检查一下。

  2. 我最近被要求比较没有主键的表,并发现HASHBYTES是一个好帮手,还有表中没有唯一行的情况,我使用了ROW_NUMBER和PARTITION来解决,见下面的代码片段。

    SELECT Row_number() 
             OVER ( 
               partition BY [hashid] 
               ORDER BY [hashid]) AS RowNumber, 
           * 
    INTO   [dbo].[mytable_temp] 
    FROM   (SELECT Hashbytes('SHA2_512', (SELECT x.* 
                                          FOR xml raw)) AS [HASHID], 
                   * 
            FROM   [dbo].[mytable] AS x) AS y 

    go 

    ALTER TABLE [dbo].[mytable_temp] 
      ALTER COLUMN [hashid] VARBINARY(900) NOT NULL 

    ALTER TABLE [dbo].[mytable_temp] 
      ALTER COLUMN [rownumber] BIGINT NOT NULL 

    go 

    ALTER TABLE [dbo].[mytable_temp] 
      ADD CONSTRAINT pk_id PRIMARY KEY ([hashid], [rownumber]) 

    go 

这样我可以根据整行内容计算出的哈希值创建基于PK的内容。

注意:我正在比较的是MyTable_TEMP而不是MyTable,这样我就可以将其保持原样。


我有同样的问题,但是表确实有主键吗?它有一个聚集的主键。 - KillerSnail
1
两个表都必须拥有某种“唯一”的列/索引,通常(理想情况下)是一个主键(PK)是唯一的。聚集索引可能是唯一的。 - jean
14
微软应该提供一些指示/信息,表明某些表需要主键才能进行比较。用户需要在输出屏幕上获得更多反馈,因为这一点在我们运行比较时并不清楚。感谢您的回答! - mike gold

3

该工具区分大小写。我不得不将模式从core重命名为Core,以便在该模式中显示表格,因为其他数据库的名称为Core


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接