我有两个相同数据库的实例。第一个数据库代表今天的数据,第二个数据来自6个月前。我需要找到特定表中条目子集的差异。
对于两个表中都有id的条目,我想找到一种方法来只查看不相同的行。
有什么想法吗?
由于
答案 0 :(得分:6)
SELECT t1.id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
WHERE ISNULL(t1.field1,'') <> ISNULL(t2.field1,'')
OR ISNULL(t1.field2,'') <> ISNULL(t2.field2,'')
OR ...
要生成长WHERE部分,您可以使用此功能:
CREATE PROCEDURE compareTables
@db1 NVARCHAR(100),
@table1 NVARCHAR(100),
@db2 NVARCHAR(100),
@table2 NVARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @where NVARCHAR(MAX)
DECLARE @cmd NVARCHAR(MAX)
SET @where = ''
SELECT @where = @where + 'ISNULL(t1.' + name + ','''') <> ISNULL(t2.' + name + ','''') OR '
FROM sys.columns WHERE object_id = OBJECT_ID(@table1)
SET @where = SUBSTRING(@where,1,LEN(@where)-3)
SET @cmd = 'SELECT t1.id FROM ' + @db1 + '.' + @table1 + ' t1 '
SET @cmd = @cmd + 'INNER JOIN ' + @db2 + '.' + @table2 + ' t2 ON t1.id = t2.id '
SET @cmd = @cmd + 'WHERE ' + @where
EXEC sp_executesql @cmd
END
GO
使用示例:
EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'
请记住将模式放在表名中。
答案 1 :(得分:3)
从您的文字中,我认为您说有一个ID可用于匹配行。
SELECT t1.*, t2.*
FROM table1 t1 JOIN table2 t2 ON t1.id=t2.id
WHERE BINARY_CHECKSUM(t1.*) <> BINARY_CHECKSUM(t2.*)
未经测试,但应该有效。
答案 2 :(得分:2)
您可以使用SQL Server 2005及更高版本附带的TableDiff.exe实用程序。
你可以read more here。
答案 3 :(得分:2)
对于SQL Server 2005及以上尝试类似的事情:
declare @CurrentTable table (pk int, valuedata varchar(5))
declare @oldtable table (pk int, valuedata varchar(5))
insert into @CurrentTable values (1,'aa')
insert into @CurrentTable values(2,'bb')
insert into @CurrentTable values(3,'cc')
insert into @CurrentTable values(4,'dd')
insert into @CurrentTable values(5,'ee')
insert into @oldtable values(1,'aa')
insert into @oldtable values(1,'bb')
insert into @oldtable values(3,'zz')
insert into @oldtable values(7,'aa')
insert into @oldtable values(8,'qq')
select pk,valuedata from @CurrentTable
except
select pk,valuedata from @oldtable
输出
pk valuedata
----------- ---------
2 bb
3 cc
4 dd
5 ee
(4 row(s) affected)
如果SQL Server 2000或更早版本尝试这样的事情:
SELECT
c.*
FROM YourTableCurrent c
LEFT OUTER JOIN YourTableOld o ON c.id=o.id
WHERE ISNULL(c.IntCol,-2147483648)!=ISNULL(o.IntCol,-2147483648)
OR ISNULL(c.varcharCol,'||null||')!=ISNULL(o.varcharCol,'||null||')
OR ISNULL(c.DatetimeCol,'01/01/1753')!=ISNULL(o.DatetimeCol,'01/01/1753')
....
UNION
SELECT
o.*
FROM YourTableOld o
LEFT OUTER JOIN YourTableCurrent c ON c.id=o.id
WHERE c.id IS NULL
....
答案 4 :(得分:1)
有点晚了,但是:
SELECT *
from Table1
except select *
from Table2
将列出Table1中表2中不存在的所有行,
SELECT *
from Table2
except select *
from Table1
将在表2中显示不在Table1中的所有内容,并且
SELECT *
from Table1
intersect select *
from Table2
将显示两个表中相同的所有行。如果已知任何列在表之间有所不同,请仅指定需要比较的列。
答案 5 :(得分:0)
您知道,有一个非常好的第三方工具可以为SQL Server数据库执行此类操作,称为SQL数据比较。它由红门出售。 http://www.red-gate.com/products/SQL_Data_Compare/index.htm?gclid=CKPp-6-Bi50CFQRM5QodtWGl8g
有一个免费试用版。但值得花钱。