В.NET, если Вы не пишете свой собственный синтаксический анализатор регулярного выражения (который я категорически не рекомендовал бы), Вы почти наверняка собираетесь должны обернуть создание нового объекта Regex с попыткой/выгодой.
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'
Не забудьте поместить схему в имя таблицы.
для 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
....
Вы можете использовать служебную программу TableDiff.exe, которая поставляется с SQL Server 2005 и более поздними версиями.
Вы можете узнать больше здесь .
Судя по вашему тексту, я думаю, вы говорите, что есть идентификатор, который можно использовать для сопоставления строк.
SELECT t1.*, t2.*
FROM table1 t1 JOIN table2 t2 ON t1.id=t2.id
WHERE BINARY_CHECKSUM(t1.*) <> BINARY_CHECKSUM(t2.*)
Не тестировалось, но должно работать.
Просто чтобы вы знали, есть потрясающий сторонний инструмент, который вы можете купить для этого вида из вещей для баз данных SQL Server называется SQL Data Compare. Продается у красных ворот. http://www.red-gate.com/products/SQL_Data_Compare/index.htm?gclid=CKPp-6-Bi50CFQRM5QodtWGl8g
Есть бесплатная пробная версия. Но на это стоит потратить деньги.
Немного поздно, но:
SELECT *
from Table1
except select *
from Table2
перечислит все строки в Table1, которых нет в Table2,
SELECT *
from Table2
except select *
from Table1
покажет все в Table2, которых нет в Table1, а
SELECT *
from Table1
intersect select *
from Table2
покажет все строки, которые идентичны в обеих таблицах. Если известно, что какие-либо столбцы в разных таблицах различаются, укажите только те столбцы, которые необходимо сравнивать.