Учитывая эти таблицы и данные:
USE tempdb;
GO
CREATE TABLE dbo.TableA
(
A INT,
B INT,
C INT,
D INT
);
CREATE TABLE dbo.TableB
(
A INT,
D INT,
B INT
);
INSERT dbo.TableA SELECT 1,4,7,11
UNION ALL SELECT 2,5,8,21
UNION ALL SELECT 3,6,9,31;
INSERT dbo.TableB SELECT 1,11,4
UNION ALL SELECT 2,21,5
UNION ALL SELECT 3,31,99;
То, что вы, похоже, ищете, является одним из следующих:
-- those where at least one column doesn't match:
SELECT A,B,D FROM dbo.TableA
EXCEPT
SELECT A,B,D FROM dbo.TableB;
Результаты (со стороны A):
A B D
---- ---- ----
3 6 31
ИЛИ
-- those where all columns DO match:
SELECT A,B,D FROM dbo.TableA
INTERSECT
SELECT A,B,D FROM dbo.TableB;
Результаты:
A B D
---- ---- ----
1 4 11
2 5 21
Если вы не знаете столбцы или не хотите выписывать их вручную, вы можете сделатьэто с динамическим SQL, просто передавая два имени таблицы (со схемой) в переменные.Обратите внимание, что это не перехватывает ошибки, которые возникнут, если столбцы no совместно используются двумя таблицами или если существуют одинаковые имена столбцов, но они имеют несовместимые типы данных.Эту обработку ошибок легко добавить, если вы хотите сделать решение более надежным.
DECLARE
@sql NVARCHAR(MAX),
@cols NVARCHAR(MAX),
@t1 NVARCHAR(511),
@t2 NVARCHAR(511);
SELECT
@sql = N'',
@cols = N'',
@t1 = N'dbo.TableA',
@t2 = N'dbo.TableB';
SELECT @cols = @cols + ',' + a.name
FROM sys.columns AS a
INNER JOIN sys.columns AS b
ON a.name = b.name
WHERE a.[object_id] = OBJECT_ID(@t1)
AND b.[object_id] = OBJECT_ID(@t2);
SET @cols = STUFF(@cols, 1, 1, N'');
-- those where at least one column doesn't match:
SELECT @sql = N'SELECT ' + @cols + '
FROM ' + @t1 + ' EXCEPT
SELECT ' + @cols + ' FROM ' + @t2 + ';';
EXEC sp_executesql @sql;
-- those where all columns DO match:
SELECT @sql = N'SELECT ' + @cols + '
FROM ' + @t1 + ' INTERSECT
SELECT ' + @cols + ' FROM ' + @t2 + ';';
EXEC sp_executesql @sql;
Не забудьте очистить:
DROP TABLE dbo.TableA, dbo.TableB;