【问题标题】:SQL - Audit two tables - Pulling singular column for errorsSQL - 审计两个表 - 拉单列错误
【发布时间】:2020-09-22 10:58:04
【问题描述】:

我有一系列表必须相互审计。 每个表都有不同数量的列,从 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 sql-server database audit unpivot


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 使用这种方法,我们必须无法自动化表格中的多样性。我有大约 20 个表要审核 - 具有各种列名/类型。如果我走这条路 - 我不能说 element1 到 element1 ...我必须明确 FirstName (Varchar) 到 FirstName(varchar)。这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多