Sql SSMS:如何查找名称相似但数据类型不同的列

Sql SSMS:如何查找名称相似但数据类型不同的列,sql,validation,sql-server-2008,metadata,information-schema,Sql,Validation,Sql Server 2008,Metadata,Information Schema,如何在预定义的表范围内查找名称相似但数据类型不同的列 背景:验证项目中的列元数据 例如:列deal_id用于3个表中 我想确保交易id元数据在任何地方都是相同的 为避免以下情况: 表1。交易id为nvarchar(50) 表2。交易id为varchar(50) 表3。交易id为nvarchar(60) 请尝试以下方法: ;with t1 as -- get tables with the same column names ( select *

如何在预定义的表范围内查找名称相似但数据类型不同的列

背景:验证项目中的列元数据

例如:列deal_id用于3个表中

我想确保交易id元数据在任何地方都是相同的

为避免以下情况:

  • 1。交易id为nvarchar(50)
  • 2。交易id为varchar(50)
  • 3。交易id为nvarchar(60)
请尝试以下方法:

;with
    t1 as       -- get tables with the same column names
    (   select *
            , count(*) over(partition by column_name) clm_cnt
        from information_schema.columns        
        where TABLE_NAME like '%'  -- specify scope of your tables  here, otherwise it will look within entire DB
    ),
    t2 as  -- get flags - if amount of distinct types/lengths/etc are >1
    (   select *
            ,cast(clm_cnt - count(*) over(partition by column_name,COLUMN_DEFAULT          ) as bit) is_diff_COLUMN_DEFAULT            
            ,cast(clm_cnt - count(*) over(partition by column_name,IS_NULLABLE             ) as bit) is_diff_IS_NULLABLE             
            ,cast(clm_cnt - count(*) over(partition by column_name,DATA_TYPE               ) as bit) is_diff_DATA_TYPE               
            ,cast(clm_cnt - count(*) over(partition by column_name,CHARACTER_MAXIMUM_LENGTH) as bit) is_diff_CHARACTER_MAXIMUM_LENGTH
            ,cast(clm_cnt - count(*) over(partition by column_name,CHARACTER_OCTET_LENGTH  ) as bit) is_diff_CHARACTER_OCTET_LENGTH  
            ,cast(clm_cnt - count(*) over(partition by column_name,NUMERIC_PRECISION       ) as bit) is_diff_NUMERIC_PRECISION       
            ,cast(clm_cnt - count(*) over(partition by column_name,NUMERIC_PRECISION_RADIX ) as bit) is_diff_NUMERIC_PRECISION_RADIX 
            ,cast(clm_cnt - count(*) over(partition by column_name,NUMERIC_SCALE           ) as bit) is_diff_NUMERIC_SCALE           
            ,cast(clm_cnt - count(*) over(partition by column_name,DATETIME_PRECISION      ) as bit) is_diff_DATETIME_PRECISION      
            ,cast(clm_cnt - count(*) over(partition by column_name,COLLATION_NAME          ) as bit) is_diff_COLLATION_NAME          
        from t1
        where clm_cnt>1
    )
select * 
from t2 
where 1=1
and 
(   0
    --| is_diff_COLUMN_DEFAULT   
    --| is_diff_IS_NULLABLE       
    | is_diff_DATA_TYPE                    
    | is_diff_CHARACTER_MAXIMUM_LENGTH 
    | is_diff_CHARACTER_OCTET_LENGTH   
    | is_diff_NUMERIC_PRECISION        
    | is_diff_NUMERIC_PRECISION_RADIX  
    | is_diff_NUMERIC_SCALE            
    | is_diff_DATETIME_PRECISION       
    | is_diff_COLLATION_NAME          
)>0 

您可以通过查询
information\u schema.column
获得有差异的列名。对于已高亮显示的属性:

select column_name
from information_schema.columns c
group by column_name
having min(data_type) <> max(data_type) or
       coalesce(min(CHARACTER_MAXIMUM_LENGTH), -1) <> coalesce(max(CHARACTER_MAXIMUM_LENGTH), -1) or
       coalesce(min(NUMERIC_PRECISION), -1) <> coalesce(max(NUMERIC_PRECISION), -1) or
       coalesce(min(NUMERIC_PRECISION_RADIX), -1) <> coalesce(max(NUMERIC_PRECISION_RADIX), -1) or
       coalesce(min(NUMERIC_SCALE), -1) <> coalesce(max(NUMERIC_SCALE), -1) or
       coalesce(min(DATETIME_PRECISION), -1) <> coalesce(max(DATETIME_PRECISION), -1) ;
选择列名称
从信息_schema.c列
按列名称分组
最小值(数据类型)最大值(数据类型)或
合并(最小(字符最大长度),-1)合并(最大(字符最大长度),-1)或
合并(最小(数值精度),-1)合并(最大(数值精度),-1)或
合并(最小值(数值精度基数),-1)合并(最大值(数值精度基数),-1)或
合并(最小值(数字刻度),-1)合并(最大值(数字刻度),-1)或
合并(最小(日期时间精度),-1)合并(最大(日期时间精度),-1);
您可能还希望包括:

  • CHARACTER\u SET\u NAME
  • COLLATION\u NAME
但是,如果始终使用默认字符集和排序规则,则这可能不适用于数据库

可空性可能与此无关