SQL - 审计两个表 - 提取单列错误
SQL - Audit two tables - Pulling singular column for errors
我有一系列 table 必须相互审计。
每个 table 都有不同数量的列,从 4 到 40 不等。
手头的任务是审核 tableA 中的列 ID 和 tableB 中的列 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 然后显示一列中的测试字段和下一列中的实时字段
所以它看起来像这样(并且需要更少的滚动和查看)
#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 table 中的所有列和 Live table 中的所有列出现然后我滚动找到罪魁祸首只给我看不正确的。
我如何更改我的声明。
** 第二部分是有没有办法让这个超级动态的#temp_tables 可以在顶部设置为变量。这样我就可以更改它们,因为我说了很多 table 来审核。并使用一个查询 *** 谢谢。
您可以使用 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
我有一系列 table 必须相互审计。 每个 table 都有不同数量的列,从 4 到 40 不等。 手头的任务是审核 tableA 中的列 ID 和 tableB 中的列 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 然后显示一列中的测试字段和下一列中的实时字段 所以它看起来像这样(并且需要更少的滚动和查看)
#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 table 中的所有列和 Live table 中的所有列出现然后我滚动找到罪魁祸首只给我看不正确的。
我如何更改我的声明。
** 第二部分是有没有办法让这个超级动态的#temp_tables 可以在顶部设置为变量。这样我就可以更改它们,因为我说了很多 table 来审核。并使用一个查询 *** 谢谢。
您可以使用 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