基本テーブルとそのアーカイブテーブル(通常はarc_
+ベーステーブル名)を比較するには、次のように書いて両方のテーブルの列数を表示します。一方の側ではなく、他に存在する列、および両側の間で異なっているカラム:2つの "brother" SQLテーブルの構造を比較
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?
これはhttp://codereview.stackexchange.com/ –
はそれについて知らなかったために、より良い可能性があります。確かにそれを使用します! Thx – user3341592