我有两个 XML。一个用于旧值,另一个用于新值。两个 XMl 都是表的列。
表A
| ID | Old Value | New Value |
+-----+----------------------------------+----------------------------------+
| 1 | <Root> | <Root> |
| | <ScreenrightsManagement> | <ScreenrightsManagement> |
| | <SCREENRIGHTID>8</SCREENRIGHTID> | <SCREENRIGHTID>8</SCREENRIGHTID> |
| | <SCREENID>9</SCREENID> | <SCREENID>10</SCREENID> |
| | <ROLEID>1</ROLEID> | <ROLEID>2</ROLEID> |
| | </ScreenrightsManagement> | </ScreenrightsManagement> |
| | </Root> | </Root> |
预期输出:
Table Name Field Name Old Value New Value
ScreenrightsManagement SCREENRIGHTID 8 8
ScreenrightsManagement SCREENID 9 10
ScreenrightsManagement ROLEID 1 2
我需要从 XML 中选择值并获得预期的输出,如图所示。我该怎么做?
最佳答案
以下查询将帮助您获得结果。
SELECT
oldvalue.ID
,oldvalue.tablename
,oldvalue.Colname as fieldname
,oldvalue.ColValue as oldvalue
,newvalue.ColValue as newvalue
FROM
(
SELECT
q.ID,
t.p.value('local-name(.)', 'varchar(50)') as Colname,
t.p.value('(.)[1]', 'varchar(50)') as ColValue,
t.p.value('local-name(..)[1]', 'varchar(50)') as tablename
FROM #test q
CROSS APPLY oldvalue.nodes('/Root/ScreenrightsManagement/*') t(p)
)oldvalue
inner join
(
SELECT
q.ID,
t.p.value('local-name(.)', 'varchar(50)') as Colname,
t.p.value('(.)[1]', 'varchar(50)') as ColValue,
t.p.value('local-name(..)[1]', 'varchar(50)') as tablename
FROM #test q
CROSS APPLY newvalue.nodes('/Root/ScreenrightsManagement/*') t(p)
)newvalue ON newvalue.Id=oldvalue.Id and newvalue.Colname=oldvalue.Colname
and newvalue.tablename=oldvalue.tablename
关于sql - 从两个 XML 列中选择并匹配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53493582/