Для порівняння T1 (PK, A, B) та T2 (PK, A, B).
Спочатку порівняйте набори первинних ключів, щоб знайти відсутні значення ключа з будь-якої сторони:
SELECT T1.*, T2.* FROM T1 FULL OUTER JOIN T2 ON T1.PK=T2.PK WHERE T1.PK IS NULL OR T2.PK IS NULL;
Потім перелічіть усі невідповідності значень:
SELECT T1.PK, 'A' AS columnName, T1.A AS leftValue, T2.A AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.A,0) != COALESCE(T2.A,0)
UNION ALL
SELECT T1.PK, 'B' AS columnName, T1.B AS leftValue, T2.B AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.B,0) != COALESCE(T2.B,0)
А і В повинні бути одного типу. Ви можете використовувати ІНФОРМАЦІЙНУ СХЕМУ для генерації SELECT. Не забувайте про COALESCE, який також включає результати IS NULL. Ви також можете використовувати ПОВНЕ ЗОВНІШНЄ ПРИЄДНАННЯ та COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0).
Наприклад для стовпців типу varchar:
SELECT concat('SELECT T1.PK, ''', COLUMN_NAME, ''' AS columnName, T1.', COLUMN_NAME, ' AS leftValue, T2.', COLUMN_NAME, ' AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.',COLUMN_NAME, ',0)!=COALESCE(T2.', COLUMN_NAME, ',0)')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='T1' AND DATA_TYPE IN ('nvarchar','varchar');