我发现 Qcpbraca 的解决方案最符合我的要求,但至少对我而言,我觉得从视觉上查看结果并知道缺少哪一列有点困难。我也经常有列名匹配但数据类型不匹配,所以我也将其添加到下面的代码中。
以下脚本对 Qcpbraca 的脚本进行了扩展,因此如果您觉得这对它有足够的帮助并投票赞成,请考虑也投票支持 Qcpbraca 的答案。
DECLARE @Table1 VARCHAR(2048) = 'Table_1',
@Table2 VARCHAR(2048) = 'Table_2'
-- Table 1 Columns into #temp_table_1
SELECT DISTINCT
a.COLUMN_NAME AS [Column Name],
a.DATA_TYPE as [Data Type],
a.CHARACTER_MAXIMUM_LENGTH,
a.NUMERIC_PRECISION,
a.NUMERIC_SCALE
into #temp_table1
FROM INFORMATION_SCHEMA.COLUMNS a
where a.TABLE_NAME = @Table1
order by a.COLUMN_NAME
-- Table 2 Columns into #temp_table_2
SELECT DISTINCT
a.COLUMN_NAME AS [Column Name],
a.DATA_TYPE as [Data Type],
a.CHARACTER_MAXIMUM_LENGTH,
a.NUMERIC_PRECISION,
a.NUMERIC_SCALE
into #temp_table2
FROM INFORMATION_SCHEMA.COLUMNS a
where a.TABLE_NAME = @Table2
order by a.COLUMN_NAME
select
@Table1 [Table 1],
isnull(t1.[Column Name],'') [Table 1 Column Name],
isnull(t2.[Column Name],'') [Table 2 Column Name],
@Table2 [Table 2],
isnull(t1.[Data Type],'') [Table 1 Column Type],
isnull(t2.[Data Type],'') [Table 2 Column Type],
isnull(cast(t1.CHARACTER_MAXIMUM_LENGTH as varchar(50)),isnull(cast(t1.NUMERIC_PRECISION as varchar(50)),'') + ',' +
isnull(cast(t1.NUMERIC_SCALE as varchar(50)),'')) [Table 1 Column Precision],
isnull(cast(t2.CHARACTER_MAXIMUM_LENGTH as varchar(50)),isnull(cast(t2.NUMERIC_PRECISION as varchar(50)),'') + ',' +
isnull(cast(t2.NUMERIC_SCALE as varchar(50)),'')) [Table 2 Column Precision],
--[Data Type Warning]
case when isnull(t1.[Column Name],'') = isnull(t2.[Column Name],'')
and (
isnull(t1.[Data Type],'') <> isnull(t2.[Data Type],'')
or
isnull(cast(t1.CHARACTER_MAXIMUM_LENGTH as varchar(50)),isnull(cast(t1.NUMERIC_PRECISION as varchar(50)),'') + ',' +
isnull(cast(t1.NUMERIC_SCALE as varchar(50)),''))
<>
isnull(cast(t2.CHARACTER_MAXIMUM_LENGTH as varchar(50)),isnull(cast(t2.NUMERIC_PRECISION as varchar(50)),'') + ',' +
isnull(cast(t2.NUMERIC_SCALE as varchar(50)),''))
)
then '*** Data Type Mismatch ***' else '' end
[Data Type Warning]
from #temp_table1 t1
full outer join #temp_table2 t2 on t1.[Column Name] = t2.[Column Name]
where 1=1
drop table #temp_table1, #temp_table2
go
这是一个示例结果集: