要将基表与其归档表(通常为arc_
+基表名称)进行比较,我已编写以下内容以显示两个表中的列数,即存在于哪些列中的列一边但不在另一边,以及两边不同的柱子:
DECLARE @base_tbl varchar(20) = 'appointments'
DECLARE @arch_tbl varchar(20) = 'arc_' + @base_tbl
DECLARE @schema varchar(35) = 'some'
-- Count in base table.
SELECT @base_tbl, COUNT(*)
FROM information_schema.columns
WHERE TABLE_NAME = @base_tbl AND TABLE_SCHEMA = @schema
-- Count in archive table.
SELECT @arch_tbl, COUNT(*)
FROM information_schema.columns
WHERE TABLE_NAME = @arch_tbl AND TABLE_SCHEMA = @schema
-- Columns only in the base or in the archive table.
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE
FROM information_schema.columns
WHERE TABLE_NAME IN (@base_tbl, @arch_tbl) AND TABLE_SCHEMA = @schema
AND COLUMN_NAME IN (
SELECT DISTINCT COLUMN_NAME FROM
(
SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME = @base_tbl AND TABLE_SCHEMA = @schema
UNION
SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME = @arch_tbl AND TABLE_SCHEMA = @schema
) u
GROUP BY COLUMN_NAME
HAVING COUNT(*) = 1)
ORDER BY COLUMN_NAME, TABLE_NAME
-- Differences.
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE
FROM information_schema.columns
WHERE TABLE_NAME IN (@base_tbl, @arch_tbl) AND TABLE_SCHEMA = @schema
AND COLUMN_NAME IN (
SELECT DISTINCT COLUMN_NAME FROM
(
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION
FROM information_schema.columns
WHERE TABLE_NAME = @base_tbl AND TABLE_SCHEMA = @schema
UNION
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION
FROM information_schema.columns
WHERE TABLE_NAME = @arch_tbl AND TABLE_SCHEMA = @schema
) v
GROUP BY COLUMN_NAME
HAVING COUNT(*) > 1)
ORDER BY COLUMN_NAME, TABLE_NAME
我想知道这是否可以改进,是为了提高可读性还是提供更好的输出支持。 WDYT?
答案 0 :(得分:1)
FULL JOIN
不会做这一切吗?
SELECT c1.COLUMN_NAME, c1.DATA_TYPE, c2.COLUMN_NAME, c2.DATA_TYPE
FROM
(
SELECT *
FROM information_schema.columns c1
WHERE c1.TABLE_NAME = 'xxx' AND c1.table_schema = 'xxx'
) c1
FULL JOIN
(
SELECT *
FROM information_schema.columns c2
WHERE c2.TABLE_NAME = 'yyy' AND c2.table_schema = 'yyy'
) c2
ON c1.COLUMN_NAME = c2.COLUMN_NAME
ORDER BY
CASE WHEN c1.COLUMN_NAME IS NULL OR c2.COLUMN_NAME IS NULL THEN 0 ELSE 1 END,
ISNULL(c1.COLUMN_NAME, c2.COLUMN_NAME)