sql - 从两个 XML 列中选择并匹配值

标签 sql sql-server xml sql-server-2008-r2

我有两个 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/

相关文章:

mysql - 内连接仅返回 1 行

mysql - Rails 快速查找 has_many 关联与关联 ID 数组完全匹配的记录

sql - 如何在 SQL Server 中读取 XML 值

sql-server - 我想从每个类别的表中选择随机问题

sql-server - 如何通过 jTDS 驱动程序使用 Trusted_connection 属性?

sql - 在 SQL Server 中存储(产品)属性的最佳模式

SQL 创建日志

python - 哪个 XML 库用于什么目的?

c# - 使用 CakeBuild XMLPoke 更改节点的内部文本值

c# - 在 C# 中使用 linq 更新 xml