我需要一个查询,可以帮助我比较同一数据库中两个表之间的列数据类型和列大小。
例如,我在同一数据库中有这些示例表:
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表进行比较。
答案 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;