SQL - 审计两张表 - 拉出单列错误

问题描述 投票:0回答:1

我有一系列的表,我必须对彼此进行审计。每个表都有不同数量的列,从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

Record_Id只是一个标识符,我希望出现,但担心的是,而不是让E表的所有列和Live表的所有列都出现,然后我滚动寻找罪魁祸首,只给我显示不正确的。

我如何改变我的声明。

** 第二部分是有没有办法让这个超级动态的#temp_tables在顶部可以设置为变量。这样我就可以改变它们,就像我说的那样,有很多表需要审计,并使用一个查询 *** 谢谢。

sql-server database audit
1个回答
0
投票

你可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.