В общем, я бы порекомендовал такой продукт, как Redgate SQL Data Compare , но в качестве одного из вариантов вы можете использовать такой скрипт:
-- Create some tables and data for testing purposes
USE [tempdb]
SET NOCOUNT ON
GO
DROP TABLE [Issues1]
DROP TABLE [Issues2]
GO
CREATE TABLE [Issues1] ([IssueID] int, [Status] varchar(max), [Who] varchar(max))
CREATE TABLE [Issues2] ([IssueID] int, [Status] varchar(max), [Who] varchar(max))
GO
INSERT [Issues1] VALUES (1, 'aaa', 'bbb')
INSERT [Issues1] VALUES (2, 'ccc', 'ddd')
INSERT [Issues1] VALUES (3, 'eee', 'fff')
GO
INSERT [Issues2] VALUES (1, 'aaa', 'bbb')
INSERT [Issues2] VALUES (3, 'ggg', 'hhh')
INSERT [Issues2] VALUES (4, 'iii', 'iii')
GO
-- **** START OF ANSWER PROPER ****
-- Create some temporary variables to store the change details
DECLARE @Inserts TABLE ([IssueID] int, [Status] varchar(max), [Who] varchar(max))
DECLARE @Updates TABLE ([IssueID] int, [OldStatus] varchar(max), [NewStatus] varchar(max), [OldWho] varchar(max), [NewWho] varchar(max))
DECLARE @Deletes TABLE ([IssueID] int, [Status] varchar(max), [Who] varchar(max))
-- Find all rows that exist in Issues2 but do not exist in Issues1
-- (matching on ID)
INSERT @Inserts
SELECT *
FROM [Issues2]
WHERE [IssueID] NOT IN
(
SELECT
[IssueID]
FROM [Issues1]
)
-- Find all rows existing in both Issues1 and Issues2 (matching on ID)
-- and where either Status or Who has changed
INSERT @Updates
SELECT
[Issues1].[IssueID],
[Issues1].[Status],
[Issues2].[Status],
[Issues1].[Who],
[Issues2].[Who]
FROM [Issues1]
INNER JOIN [Issues2] ON [Issues2].[IssueID] = [Issues1].[IssueID]
AND
(
[Issues2].[Status] != [Issues1].[Status]
OR [Issues2].[Who] != [Issues1].[Who]
)
-- Find all rows that exist in Issues1 but do not exist in Issues2
-- (matching on ID)
INSERT @Deletes
SELECT *
FROM [Issues1]
WHERE [IssueID] NOT IN
(
SELECT
[IssueID]
FROM [Issues2]
)
-- Output the results
SELECT
(SELECT COUNT(*) FROM @Inserts) AS [Number Inserted],
(SELECT COUNT(*) FROM @Updates) AS [Number Updated],
(SELECT COUNT(*) FROM @Deletes) AS [Number Deleted]
SELECT 'INSERTED', * FROM @Inserts
SELECT 'UPDATED', * FROM @Updates
SELECT 'DELETED', * FROM @Deletes
GO