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

问题描述 投票:0回答:2

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

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

例如:3个表中使用了deal_id列。

我想确保Deal_id元数据在所有地方都是相同的。

为了避免遵循:

  • table 1。deal_id是n varchar(50)
  • 2。deal_id为varchar(50)
  • table 3。deal_id为n varchar(6 0)
sql validation sql-server-2008 metadata information-schema
2个回答
0
投票

请尝试这个:

;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 in ***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,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 
(     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 

0
投票

您可以通过在information_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) ;
© www.soinside.com 2019 - 2024. All rights reserved.