MSSQL: compare structure description in databases

Byphunsanit

MSSQL: compare structure description in databases


ตัวนี้เป็น version ที่เพิ่มความสามารถให้ตรวจสอบ description เพิ่มขึ้นมาจาก MSSQL: compare column in table databases โดนเพิ่ม description, nameimg ขึ้นมา
compare_structure_in_databases_v.2_description.sql

-- Declare variables for the database names
DECLARE @db1 NVARCHAR(128) = 'DB_DEV';
DECLARE @db2 NVARCHAR(128) = 'DB_QA';
-- Use dynamic SQL to build the query
DECLARE @sql NVARCHAR(MAX);

SET
@sql = N'
    -- CTE 1: Get all column descriptions from Database 1 (@db1)
    WITH Descriptions_DB1 AS (
        SELECT
            s.name AS TableSchema,
            t.name AS TableName,
            c.name AS ColumnName,
            CAST(p.value AS NVARCHAR(MAX)) AS Description -- Description is stored as the value of the Extended Property
        FROM ' + QUOTENAME(@db1) + '.sys.columns c
        JOIN ' + QUOTENAME(@db1) + '.sys.tables t ON t.object_id = c.object_id
        JOIN ' + QUOTENAME(@db1) + '.sys.schemas s ON s.schema_id = t.schema_id
        LEFT JOIN ' + QUOTENAME(@db1) + '.sys.extended_properties p
            -- Join on major_id (Table ID) and minor_id (Column ID)
            ON p.major_id = t.object_id
            AND p.minor_id = c.column_id
            AND p.class_desc = ''OBJECT_OR_COLUMN'' -- Ensure it is a column property
            AND p.name = ''MS_Description'' -- Filter for the standard description property name
    ),
    -- CTE 2: Get all column descriptions from Database 2 (@db2)
    Descriptions_DB2 AS (
        SELECT
            s.name AS TableSchema,
            t.name AS TableName,
            c.name AS ColumnName,
            CAST(p.value AS NVARCHAR(MAX)) AS Description
        FROM ' + QUOTENAME(@db2) + '.sys.columns c
        JOIN ' + QUOTENAME(@db2) + '.sys.tables t ON t.object_id = c.object_id
        JOIN ' + QUOTENAME(@db2) + '.sys.schemas s ON s.schema_id = t.schema_id
        LEFT JOIN ' + QUOTENAME(@db2) + '.sys.extended_properties p
            ON p.major_id = t.object_id
            AND p.minor_id = c.column_id
            AND p.class_desc = ''OBJECT_OR_COLUMN''
            AND p.name = ''MS_Description''
    )
    -- Perform a FULL OUTER JOIN to find differences
    SELECT
        ISNULL(d1.TableSchema, d2.TableSchema) AS TableSchema,
        ISNULL(d1.TableName, d2.TableName) AS TableName,
        ISNULL(d1.ColumnName, d2.ColumnName) AS ColumnName,
        CASE
            WHEN d1.Description IS NULL AND d2.Description IS NOT NULL THEN ''Missing Description in ' + QUOTENAME(@db1) + '''
            WHEN d1.Description IS NOT NULL AND d2.Description IS NULL THEN ''Missing Description in ' + QUOTENAME(@db2) + '''
            WHEN d1.Description <> d2.Description THEN ''Description Mismatch''
            ELSE ''No Difference Found'' -- Should be filtered out by the WHERE clause
        END AS DifferenceType,
        d1.Description AS ' + QUOTENAME(@db1 + '_Description') + N', -- FIX: Comma added to the dynamic string
        d2.Description AS ' + QUOTENAME(@db2 + '_Description') + N'
    FROM Descriptions_DB1 d1
    FULL OUTER JOIN Descriptions_DB2 d2
        ON d1.TableSchema = d2.TableSchema
        AND d1.TableName = d2.TableName
        AND d1.ColumnName = d2.ColumnName
    -- Filter for actual differences in the Description value
    -- We use ISNULL with a unique placeholder (N''NULL_PLACEHOLDER_42'') to correctly handle
    -- NULL vs NOT-NULL and direct Mismatch comparisons in a single, robust condition.
    WHERE
        ISNULL(d1.Description, N''NULL_PLACEHOLDER_42'') <> ISNULL(d2.Description, N''NULL_PLACEHOLDER_42'')
    ORDER BY TableSchema, TableName, ColumnName;
';
-- Execute the dynamic SQL
EXEC sp_executesql @sql;

version นี้เพิ่มการตรวจสอบ description ขึ้นมาเพิ่อช่วยในการ nameimg ได้ง่ายขึ้น

About the author

phunsanit administrator