script ทำขึ้นมาเพื่อหา column ที่โครงสร้างของ column ที่เกี่ยวข้องกันในคนละตารางแต่ว่า กลับมี type, size, null ต่างกัน โดยทำต่อจาก SQL Server: check column name type size เพื่อให้หาจุดที่ควรจะต้องแก้ไขให้ง่ายขึ้น
audit_inconsistent_columns_detector.sql
/*
* Objective: Detect Schema Inconsistencies (Schema Drift)
* * This query identifies columns across different tables that share the same
* logical name (CleanedColumnName) but have conflicting definitions:
* 1. Different Data Types (e.g., int vs bigint)
* 2. Different Sizes/Precisions (e.g., varchar(50) vs varchar(100))
* 3. Different Nullability rules (NULL vs NOT NULL)
*/
WITH RawColumns AS (
SELECT
table_schema AS SchemaName,
table_name AS TableName,
column_name AS ColumnName,
-- Normalize data type for accurate comparison
LOWER(RTRIM(LTRIM(data_type))) AS DataType,
-- Capture Nullability (YES/NO)
is_nullable AS IsNullable,
-- Standardize Data Size representation based on the data type category
CASE
-- String types: use max character length
WHEN character_maximum_length IS NOT NULL
THEN CAST(character_maximum_length AS VARCHAR)
-- Date/Time types: use precision (e.g., 3 for milliseconds)
WHEN datetime_precision IS NOT NULL
THEN CAST(datetime_precision AS VARCHAR)
-- Numeric types: combine precision and scale (e.g., 18,2)
WHEN numeric_precision IS NOT NULL AND numeric_scale IS NOT NULL
THEN CAST(numeric_precision AS VARCHAR) + ',' + CAST(numeric_scale AS VARCHAR)
ELSE 'N/A'
END AS DataSize,
-- Logic to clean column names by removing prefixes
-- (e.g., converts 'tb_created_at' to 'created_at')
CASE
WHEN column_name LIKE '%_%' THEN SUBSTRING(column_name, CHARINDEX('_', column_name) + 1, LEN(column_name))
ELSE column_name
END AS CleanedColumnName
FROM information_schema.columns
),
DiffCheck AS (
-- Filter logic: Identify only the CleanedColumnNames that have inconsistencies.
-- If a column name is consistent across all tables, it will be excluded here.
SELECT CleanedColumnName
FROM RawColumns
GROUP BY CleanedColumnName
HAVING
COUNT(DISTINCT DataType) > 1 -- Found different Data Types
OR COUNT(DISTINCT DataSize) > 1 -- Found different Sizes/Precisions
OR COUNT(DISTINCT IsNullable) > 1 -- Found different Nullability settings
)
SELECT
r.SchemaName,
r.TableName,
r.ColumnName,
r.CleanedColumnName,
r.DataType,
r.DataSize,
r.IsNullable
FROM RawColumns r
INNER JOIN DiffCheck d ON r.CleanedColumnName = d.CleanedColumnName
ORDER BY
r.CleanedColumnName, -- Group related columns together
r.DataType, -- Sort to easily spot the differences
r.DataSize,
r.SchemaName;
อ่านเพิ่มเติม