Widened your specification to also include column names that are present in both, but have different type, max length, etc. and columns that exist in "_dup" that do NOT exist in the main table.-- Create test tablesCREATE TABLE employee( e_ID int identity(1,1) NOT NULL, e_name varchar(20) NOT NULL, e_phone varchar(20) NULL, e_phone2 varchar(20) NULL, -- Missing from "_dup" PRIMARY KEY ( e_ID ))GOCREATE TABLE employee_dup( idn int NOT NULL, e_ID int identity(1,1) NOT NULL, e_name varchar(20) NOT NULL, e_phone varchar(30) NULL, -- Larger than original table e_phone3 varchar(20) NULL, -- Missing from original table PRIMARY KEY ( e_ID ))GOSELECT [Table] = T1_name, [Msg] = CASE WHEN C1_object_id IS NULL THEN 'Missing1' WHEN C2_object_id IS NULL THEN 'Missing2' ELSE 'Different' END, [Column] = C1_name, [Type1] = TY1.name, [*] = CASE WHEN COALESCE(TY1.system_type_id, -1) <> COALESCE(TY2.system_type_id, -1) THEN '*' ELSE '' END, [Type2] = TY2.name, [max_length1] = C1_max_length, [*] = CASE WHEN COALESCE(C1_max_length, -1) <> COALESCE(C2_max_length, -1) THEN '*' ELSE '' END, [max_length2] = C2_max_length, [precision1] = C1_precision, [*] = CASE WHEN COALESCE(C1_precision, -1) <> COALESCE(C2_precision, -1) THEN '*' ELSE '' END, [precision2] = C2_precision, [scale1] = C1_scale, [*] = CASE WHEN COALESCE(C1_scale, -1) <> COALESCE(C2_scale, -1) THEN '*' ELSE '' END, [scale2] = C2_scale, [collation_name1] = C1_collation_name, [*] = CASE WHEN COALESCE(C1_collation_name, '') <> COALESCE(C2_collation_name, '') THEN '*' ELSE '' END, [collation_name2] = C2_collation_nameFROM( SELECT [T1_name] = T1.name, [C1_name] = C1.name, [C1_object_id] = C1.object_id, [C2_object_id] = C2.object_id, [C1_column_id] = C1.column_id, [C1_system_type_id] = C1.system_type_id, [C2_system_type_id] = C2.system_type_id, [C1_max_length] = C1.max_length, [C2_max_length] = C2.max_length, [C1_precision] = C1.precision, [C2_precision] = C2.precision, [C1_scale] = C1.scale, [C2_scale] = C2.scale, [C1_collation_name] = C1.collation_name, [C2_collation_name] = C2.collation_name FROM sys.tables AS T1 JOIN sys.tables AS T2 ON T2.name = T1.name + '_dup' JOIN sys.columns AS C1 ON C1.object_id = T1.object_id LEFT OUTER JOIN sys.columns AS C2 ON C2.object_id = T2.object_id AND C2.name = C1.name UNION ALL SELECT [T1_name] = T1.name, [C1_name] = COALESCE(C1.name, C2.name), [C1_object_id] = C1.object_id, [C2_object_id] = C2.object_id, [C1_column_id] = COALESCE(C1.column_id, C2.column_id), [C1_system_type_id] = C1.system_type_id, [C2_system_type_id] = C2.system_type_id, [C1_max_length] = C1.max_length, [C2_max_length] = C2.max_length, [C1_precision] = C1.precision, [C2_precision] = C2.precision, [C1_scale] = C1.scale, [C2_scale] = C2.scale, [C1_collation_name] = C1.collation_name, [C2_collation_name] = C2.collation_name FROM sys.tables AS T1 JOIN sys.tables AS T2 ON T2.name = T1.name + '_dup' JOIN sys.columns AS C2 ON C2.object_id = T2.object_id LEFT OUTER JOIN sys.columns AS C1 ON C1.object_id = T1.object_id AND C1.name = C2.name WHERE C1.object_id IS NULL AND C2.name <> 'idn' -- Ignore column "IDN" only in "_DUP") AS X LEFT OUTER JOIN sys.types AS TY1 ON TY1.system_type_id = C1_system_type_id LEFT OUTER JOIN sys.types AS TY2 ON TY2.system_type_id = C2_system_type_idWHERE C1_object_id IS NULL -- Column does not exist in main table OR C2_object_id IS NULL -- Column does not exist in "_dup" table OR C1_system_type_id <> C2_system_type_id OR C1_max_length <> C2_max_length OR C1_precision <> C2_precision OR C1_scale <> C2_scale OR (C1_collation_name <> C2_collation_name OR (C1_collation_name IS NULL AND C2_collation_name IS NOT NULL) OR (C1_collation_name IS NOT NULL AND C2_collation_name IS NULL) )--ORDER BY T1_name, C1_column_id, C1_name