SQL 数据比较 - 缺少一些表格
SQL Data Compare - Some tables missing
当通过 VS 2013 pro 使用 SQL 服务器数据工具进行数据比较时,我遇到了一些 table 似乎被遗漏的情况。
我的意思是源服务器上的 TableA
中有数据,但目标服务器上的等效 table 中没有数据。
但是结果 window 甚至没有显示 TableA
的一行。
此外,如果我在下一步中尝试在按 "Finish" 之前过滤结果,TableA
不会显示为过滤依据的选项。就好像 table 在目标服务器上不存在一样。我已经通过以下方式验证了这一点:
- 正在通过 SSMS 连接并查看 tables
的列表
- 运行
SELECT * FROM information_schema.tables
在这两种情况下,我都可以看到列出了 table。
还有其他人看到了吗?我错过了什么?
只有当您知道必须比较 table 中的哪些记录时,才能比较数据。比较器使用 PK 来知道要比较哪些记录。如果您的 table 没有 PK(或至少没有唯一索引),那么它会从 tables 列表中丢失。
可以自己创建PK来解决(只是为了对比)
编辑
一位同事最近遇到了困难,因为有人从比较项目中明确排除了一些 table 并将其提交给 git。所以如果不是新项目就检查一下吧
我最近的任务是比较没有 PK 的 tables,发现 HASHBYTES to be a new friend, also there are not unique rows in the tables and to solve it I used 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
。这样我就可以保持原状。
该工具区分大小写。我不得不将模式从 core
重命名为 Core
以显示该模式中的表,因为另一个数据库的名称为 Core
.
当通过 VS 2013 pro 使用 SQL 服务器数据工具进行数据比较时,我遇到了一些 table 似乎被遗漏的情况。
我的意思是源服务器上的 TableA
中有数据,但目标服务器上的等效 table 中没有数据。
但是结果 window 甚至没有显示 TableA
的一行。
此外,如果我在下一步中尝试在按 "Finish" 之前过滤结果,TableA
不会显示为过滤依据的选项。就好像 table 在目标服务器上不存在一样。我已经通过以下方式验证了这一点:
- 正在通过 SSMS 连接并查看 tables 的列表
- 运行
SELECT * FROM information_schema.tables
在这两种情况下,我都可以看到列出了 table。
还有其他人看到了吗?我错过了什么?
只有当您知道必须比较 table 中的哪些记录时,才能比较数据。比较器使用 PK 来知道要比较哪些记录。如果您的 table 没有 PK(或至少没有唯一索引),那么它会从 tables 列表中丢失。
可以自己创建PK来解决(只是为了对比)
编辑
一位同事最近遇到了困难,因为有人从比较项目中明确排除了一些 table 并将其提交给 git。所以如果不是新项目就检查一下吧
我最近的任务是比较没有 PK 的 tables,发现 HASHBYTES to be a new friend, also there are not unique rows in the tables and to solve it I used 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
。这样我就可以保持原状。
该工具区分大小写。我不得不将模式从 core
重命名为 Core
以显示该模式中的表,因为另一个数据库的名称为 Core
.