看了一下tablediff的比较,网上有些文章说NULL不能比较,但是同步测试了SQL 2008 的功能,发现其实能够比较出NULL值的。
运行tablediff命令:SQL Profiler 跟踪出以下sql:
SELECT
[
dbo
].
[
Tmp
].
[
ID
],
BINARY_CHECKSUM( [ dbo ]. [ Tmp ]. [ Account ], [ dbo ]. [ Tmp ]. [ CharName ],
[ dbo ]. [ Tmp ]. [ ID ]) as MShash_54267293
FROM [ dbo ]. [ Tmp ] WITH ( READUNCOMMITTED )
ORDER BY [ dbo ]. [ Tmp ]. [ ID ]
SELECT [ dbo ]. [ Tmp_Check ]. [ ID ],
BINARY_CHECKSUM( [ dbo ]. [ Tmp_Check ]. [ Account ],
[ dbo ]. [ Tmp_Check ]. [ CharName ], [ dbo ]. [ Tmp_Check ]. [ ID ]) as MShash_54267293
FROM [ dbo ]. [ Tmp_Check ] WITH ( READUNCOMMITTED )
ORDER BY [ dbo ]. [ Tmp_Check ]. [ ID ]
BINARY_CHECKSUM( [ dbo ]. [ Tmp ]. [ Account ], [ dbo ]. [ Tmp ]. [ CharName ],
[ dbo ]. [ Tmp ]. [ ID ]) as MShash_54267293
FROM [ dbo ]. [ Tmp ] WITH ( READUNCOMMITTED )
ORDER BY [ dbo ]. [ Tmp ]. [ ID ]
SELECT [ dbo ]. [ Tmp_Check ]. [ ID ],
BINARY_CHECKSUM( [ dbo ]. [ Tmp_Check ]. [ Account ],
[ dbo ]. [ Tmp_Check ]. [ CharName ], [ dbo ]. [ Tmp_Check ]. [ ID ]) as MShash_54267293
FROM [ dbo ]. [ Tmp_Check ] WITH ( READUNCOMMITTED )
ORDER BY [ dbo ]. [ Tmp_Check ]. [ ID ]
判断表中某一行的不同,使用了BINARY_CHECKSUM函数
按照表的某一行或表达式列表计算的二进制校验和值。BINARY_CHECKSUM 可用于检测表中行的更改
指定对表中的所有列进行计算。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的列。不可比数据类型包括
text、
ntext、
image、
cursor、
xml 和不可比公共语言运行库 (CLR) 用户定义的类型。
如果发现目标库没有:
SELECT
[
dbo
].
[
Tmp
].
[
Account
],
[
dbo
].
[
Tmp
].
[
CharName
],
[
dbo
].
[
Tmp
].
[
ID
]
FROM
[
dbo
].
[
Tmp
]
WITH (READUNCOMMITTED)
WHERE
[
ID
]
=
1
执行上面语句生成 insert语句。是一条一条生成。
如果目标库有不一样的
SELECT
[
dbo
].
[
Tmp_Check
].
[
Account
],
[
dbo
].
[
Tmp_Check
].
[
CharName
],
[
dbo
].
[
Tmp_Check
].
[
ID
]
FROM
[
dbo
].
[
Tmp_Check
]
WITH (READUNCOMMITTED)
WHERE
[
ID
]
=
4
目标库也会执行上面的查询得出哪个列不一样和生成更新sql
以上如果在SQL 2008 中执行tablediff生成大量数据会很慢,同时也会造成内存溢出。
总结(适用于SQL 2008 SP3):
1,tablediff 会忽略不可比较的字段
2,NULL也会比较出来
3,比较是先全部查询出数据,再把不同的行查出具体数据生成insert,update,delete 语句
4,数据量大时性能影响很大