Я экспериментировал с образцом в блоге сервера Джеффа. для сравнения двух таблиц и поиска различий.
В моем случае таблицы - это резервная копия и текущие данные. Я могу получить то, что хочу, с помощью этой инструкции SQL (упрощенной за счет удаления большинства столбцов). Затем я могу увидеть строки из каждой таблицы, которые не имеют точного соответствия, и я могу увидеть, из какой таблицы они взяты.
SELECT
MIN(TableName) as TableName
,[strCustomer]
,[strAddress1]
,[strCity]
,[strPostalCode]
FROM
(SELECT
'Old' as TableName
,[JAS001].[dbo].[AR_CustomerAddresses].[strCustomer]
,[JAS001].[dbo].[AR_CustomerAddresses].[strAddress1]
,[JAS001].[dbo].[AR_CustomerAddresses].[strCity]
,[JAS001].[dbo].[AR_CustomerAddresses].[strPostalCode]
FROM
[JAS001].[dbo].[AR_CustomerAddresses]
UNION ALL
SELECT
'New' as TableName
,[JAS001new].[dbo].[AR_CustomerAddresses].[strCustomer]
,[JAS001new].[dbo].[AR_CustomerAddresses].[strAddress1]
,[JAS001new].[dbo].[AR_CustomerAddresses].[strCity]
,[JAS001new].[dbo].[AR_CustomerAddresses].[strPostalCode]
FROM
[JAS001new].[dbo].[AR_CustomerAddresses]) tmp
GROUP BY
[strCustomer]
,[strAddress1]
,[strCity]
,[strPostalCode]
HAVING
COUNT(*) = 1
Этот ответ о переполнении стека дает мне гораздо более чистый SQL-запрос, но не говорит мне, из какой таблицы взяты строки.
SELECT * FROM [JAS001new].[dbo].[AR_CustomerAddresses]
UNION
SELECT * FROM [JAS001].[dbo].[AR_CustomerAddresses]
EXCEPT
SELECT * FROM [JAS001new].[dbo].[AR_CustomerAddresses]
INTERSECT
SELECT * FROM [JAS001].[dbo].[AR_CustomerAddresses]
Я мог бы использовать первую версию, но у меня есть много таблиц, которые мне нужно сравнить, и я думаю, что должен быть простой способ добавить столбец исходной таблицы во второй запрос. Я пробовал несколько вещей и гуглил безрезультатно. Я подозреваю, что, возможно, я просто не ищу правильную вещь, так как уверен, что на нее уже был дан ответ.
Может быть, я иду по ложному следу, и есть лучший способ сравнить базы данных?