比较SQL Server中同一数据库中的列数据类型和大小

时间:2018-07-14 12:35:40

标签: sql-server-2012

我需要一个查询,可以帮助我比较同一数据库中两个表之间的列数据类型和列大小。

例如,我在同一数据库中有这些示例表:

Table Names
-----------
I_A
I_B
I_C
T_A
T_B
T_C
ABC

我必须比较I和T表之间的列数据类型或列大小不匹配。

例如,我必须像这样将I_A与T_A表和I_B与T_B表进行比较。

1 个答案:

答案 0 :(得分:0)

我相信这样的查询将识别列差异。如果您还需要标识一个表中存在但其他表中不存在的列,请在最后的SELECT中使用FULL OUTER JOIN调整WHERE子句,以在I或T值中包含带有NULL的行

WITH
    i_tables AS (
        SELECT
              RIGHT(t.name, 1) AS table_suffix
            , c.name AS column_name
            , ty.name AS type_name
            , c.max_length
            , c.precision
            , c.scale
            , c.is_nullable
        FROM sys.tables AS t
        JOIN sys.columns AS c ON
            c.object_id = t.object_id
        JOIN sys.types AS ty ON
            ty.system_type_id = c.system_type_id
            AND ty.user_type_id = c.user_type_id
        WHERE t.name LIKE 'I[_]_'
    )
    ,t_tables AS (
        SELECT
              RIGHT(t.name, 1) AS table_suffix
            , c.name AS column_name
            , ty.name AS type_name
            , c.max_length
            , c.precision
            , c.scale
            , c.is_nullable
        FROM sys.tables AS t
        JOIN sys.columns AS c ON
            c.object_id = t.object_id
        JOIN sys.types AS ty ON
            ty.system_type_id = c.system_type_id
            AND ty.user_type_id = c.user_type_id
        WHERE t.name LIKE 'T[_]_'
    )
SELECT *
FROM i_tables
JOIN t_tables ON 
    t_tables.table_suffix = i_tables.table_suffix
    AND t_tables.column_name = i_tables.column_name
WHERE
    t_tables.type_name <> i_tables.type_name
    AND t_tables.max_length <> i_tables.max_length
    AND t_tables.precision <> i_tables.precision
    AND t_tables.scale <> i_tables.scale
    AND t_tables.is_nullable <> i_tables.is_nullable;