Tag Archive type

Byphunsanit

SQL Server: check column name type size

จากเรื่อง SQL Server: Join table with varchar, nvarchar size ชนิด column ไม่ตรงกัน หรือแม้แต่ชนิด varchar, nvarchar ต่างกัน เวลาเอามา join กันมันทำให้ Performance Impact จึงทำ query มาเช็ก column name ว่าแต่ละตาราง มันมี type, size ตรงกันมั๋ย
audit_table_column_type_and_size.sql

WITH RawColumns AS (
    SELECT 
        table_catalog AS DatabaseName,
        table_schema AS SchemaName,
        table_name AS TableName,
        column_name AS ColumnName,
        data_type AS DataType,
        -- จัดการเรื่อง DataSize
        CASE
            WHEN character_maximum_length IS NOT NULL THEN CAST(character_maximum_length AS VARCHAR)
            WHEN datetime_precision IS NOT NULL THEN CAST(datetime_precision AS VARCHAR)
            WHEN numeric_precision IS NOT NULL AND numeric_scale IS NOT NULL 
                THEN CAST(numeric_precision AS VARCHAR) + ',' + CAST(numeric_scale AS VARCHAR)
            WHEN numeric_precision IS NOT NULL THEN CAST(numeric_precision AS VARCHAR)
            ELSE 'N/A'
        END AS DataSize,
        -- ตัด Prefix ออก (สมมติว่า prefix จบด้วย underscore เช่น 'pp_column_name')
        -- หากไม่มีขีดล่างจะใช้ชื่อเดิม
        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
),
ColumnStats AS (
    -- นับว่าในแต่ละ CleanedColumnName มี Type หรือ Size ที่ต่างกันกี่แบบ
    SELECT 
        CleanedColumnName,
        COUNT(DISTINCT DataType) AS DistinctTypes,
        COUNT(DISTINCT DataSize) AS DistinctSizes
    FROM RawColumns
    GROUP BY CleanedColumnName
)
SELECT 
    r.DatabaseName,
    r.SchemaName,
    r.TableName,
    r.DatabaseName + '.' + r.SchemaName + '.' + r.TableName AS FullyQualifiedDomainName,
    r.ColumnName,
    r.CleanedColumnName,
    r.DataType,
    r.DataSize
FROM RawColumns r
JOIN ColumnStats s ON r.CleanedColumnName = s.CleanedColumnName
-- เงื่อนไข: แสดงเฉพาะ column ที่มี type หรือ size ไม่เหมือนเพื่อนในชื่อ cleaned เดียวกัน
WHERE s.DistinctTypes > 1 OR s.DistinctSizes > 1
ORDER BY 
    r.CleanedColumnName, 
    r.SchemaName, 
    r.TableName;