sql-audit两个表-pulling singular column for errors

fxnxkyjh  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(239)

我有一系列的表,我必须互相审核。每个表的列数从4到40不等。手头的任务是审核表A中的列id和表b中的列id。等。
我的代码是这样的

SELECT          mismatch_field =    
CASE            WHEN E.id <> Live.id THEN 'ID'
                WHEN E.FirstName <> Live.FirstName THEN 'FirstName'
                WHEN E.LastName <> Live.LastName THEN 'LastName'
                WHEN E.WEB_Name <> Live.WEB_Name THEN 'WEB_Name'
                END,
                E.*,    
                '<-EDI -- LIVE->',  
                Live.*
from            #upld_TEST E    
left outer join #upld_LIVE Live on E.id = Live.id
WHERE       (   E.id    <> Live.id OR 
                E.FirstName <> Live.FirstName OR 
                E.LastName  <> Live.LastName OR
                E.WEB_Name  <> Live.WEB_Name    )
ORDER BY CASE   WHEN E.id <> Live.id THEN 'id'
                WHEN E.FirstName <> Live.FirstName THEN 'FirstName'
                WHEN E.LastName <> Live.LastName THEN 'LastName'
                WHEN E.WEB_Name <> Live.WEB_Name THEN 'WEB_Name'
                END

这很简单。找到不匹配的字段,并报告不匹配的列和其余列以供审阅。
我想做的是把输出简化一点。如果e.firstname<>live.firstname,我希望输出读取firstname,然后在一列中显示test字段,在下一列中显示live字段,这样看起来像这样(并且需要更少的滚动和查看)


# Upld_Test  Record_id   Upld_Test           Upld_Live

ID          12          626                 231
FirstName   24          John                Mark
FirstName   55          Sam                 Jani
WebName     11          Lake Smith          Lake Smith's

记录id只是我想显示的一个标识符,但问题不是让e表中的所有列和live表中的所有列都显示出来,然后滚动查找罪魁祸首,只显示不正确的列。
如何更改我的声明。

第二部分是,有没有一种方法可以使这个超级动态的表可以在顶部设置为变量。所以我可以改变他们,因为我说了很多表审计。使用一个查询*谢谢。

z9gpfhce

z9gpfhce1#

你可以用 cross apply . 这有点棘手,因为您需要对齐数据类型-我不知道它们是什么,所以我使用了 varchar(max) 无处不在:

select v.*
from #upld_TEST e
inner join #upld_live l on u.id = l.id
cross apply (values 
    (
        e.id, 
        'id', 
        cast(e.id as varchar(max)), 
        cast(l.id as varchar(max))
    ),
    (
        e.id, 
        'FirstName', 
        cast(e.FirstName as varchar(max)), 
        cast(l.FirstName as varchar(max))
    ),
    (
        e.id, 
        'LastName', 
        cast(e.LastName as varchar(max)), 
        cast(l.LastName as varchar(max))
    ),
    (
        e.id, 
        'WEB_Name', 
        cast(e.WEB_Name as varchar(max)), 
        cast(l.WEB_Name  as varchar(max))
    )
) v(record_id, col, test_val, live_val)
where v.test_val <> v.live_val

相关问题