Сравните столбцы таблицы и отобразите различия в сообщениях об ошибках в SQL Server 2014 - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь написать некоторый SQL, который будет сравнивать две таблицы сервера SQL и отображать любые различия в столбцах в сообщении об ошибке.Там может быть несколько различий, поэтому мне нужно каждый из них, упомянутых в сообщении об ошибке.Я начал с этого, но заинтересовался некоторыми указаниями о том, как уловить точные различия.

Спасибо,

SELECT      name, 
        object_id   
INTO        #sysTbl
FROM        sys.tables
ORDER BY    name

SELECT      t.name AS 't_name', 
            cols.name AS 'c_name', 
            cols.user_type_id,
            typ.name as user_type_name,
            cols.max_length,
            cols.is_nullable
INTO        #sysCols
FROM        #sysTbl t
INNER JOIN  sys.all_columns AS cols ON t.object_id = cols.object_id
INNER JOIN  sys.types AS typ ON cols.user_type_id = typ.user_type_id

    SELECT  *
    INTO #errorTbl
    FROM 
    (
        SELECT  *
        FROM    dbo.[metaDataFile] 
        EXCEPT
        SELECT  *
        FROM    #sysCols
        UNION 
        SELECT  *
        FROM    #sysCols
        EXCEPT
        SELECT *
        FROM    dbo.[metaDataFile] 
    ) err

    DECLARE @errStr VARCHAR(MAX) 
    --build Error Message
    select @errStr = 'There is a mismatch on' + stuff((select ',' + ' table ' + t_name +' on column ' + c_name 
                FROM #errorTbl t2
                FOR XML PATH('')),1,1,'')

        IF EXISTS 
        (
            SELECT *
            FROM #errorTbl
        )
                RAISERROR (@errStr, 
                   16, -- Severity,  
                   1, -- State,  
                   N'Failure due to data mismatch'); 
        ELSE
            BEGIN
                PRINT 'Success - Data Matches'
            END

1 Ответ

0 голосов
/ 19 июня 2019

Это может быть чрезмерно упрощено, но мы попытаемся использовать информационную схему:

select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_CATALOG='DB NAME'
    and TABLE_NAME='TABLE NAME'

Это даст всю информацию столбца и метаданные, относящиеся к рассматриваемой таблице.

Теперь попробуйте этодля обоих:

select 
    t1.COLUMN_NAME
    ,DataType_NoMatch = case when t1.DATA_TYPE <> t2.DATA_TYPE then 1 else 0 end
from
    (
    select *
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_CATALOG='DB NAME'
        and TABLE_SCHEMA = 'SCHEMA'
        and TABLE_NAME='TABLE'
        ) t1
    join
    (
    select *
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_CATALOG='DBANME'
        and TABLE_SCHEMA = 'SCHEMA'
        and TABLE_NAME='TABLE2'
    ) t2 on t1.COLUMN_NAME=t2.COLUMN_NAME

и проработайте атрибуты, которые вы хотите сравнить.Я привел вам пример для типа данных.

Добавлено на основе комментариев Cross apply:

select 
    t1.COLUMN_NAME
    ,ca.*
from
    (
    select *
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_CATALOG='DB NAME'
        and TABLE_SCHEMA = 'dbo'
        and TABLE_NAME='DimOrganization'
        ) t1
    join
    (
    select *
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_CATALOG='DB NAME'
        and TABLE_SCHEMA = 'bak'
        and TABLE_NAME='DimOrganization'
    ) t2 on t1.COLUMN_NAME=t2.COLUMN_NAME
cross apply
    (select Metadata = 'DataType' ,TestPassFail = case when t1.DATA_TYPE <> t2.DATA_TYPE then 1 else 0 end 
     union all
     select [Column] = 'CharMaxLen' ,TestPassFail = case when t1.CHARACTER_MAXIMUM_LENGTH <> t2.CHARACTER_MAXIMUM_LENGTH then 1 else 0 end
     ) ca

where ca.TestPassFail=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...