sql - 同步两个xml文档的tsql代码

标签 sql t-sql sql-server-2005

xml 1

<Team>
  <Players>
    <Player id="1" timestamp="11/03/2012 08:10:12">30</Player>
    <Player id="2" timestamp="11/02/2012 09:11:12">40</Player>
  <Players>
</Team>

xml 2

<Team>
  <Players>
    <Player id="1" timestamp="11/02/2012 09:10:12">10</Player>
    <Player id="2" timestamp="11/03/2012 10:11:12">20</Player>
    <Player id="3" timestamp="11/03/2012 13:00:00">50</Player>
  <Players>
</Team>

当我们根据时间戳元素合并以上两个 XML 时的输出:

<Team>
  <Players>
    <Player id="1" timestamp="11/02/2012 09:10:12">30</Player>
    <Player id="2" timestamp="11/03/2012 10:11:12">20</Player>
    <Player id="3" timestamp="11/03/2012 13:00:00">50</Player>
  <Players>
</Team>

任何人都可以帮助我使用 T-SQL 代码在 SQL Server 2005/2008 中执行此操作

最佳答案

使用这种带有两个嵌套 CTE 的方法,您可以接近 - 但不能完全:

DECLARE @XML1 XML = '<Team>
  <Players>
    <Player id="1" timestamp="11/03/2012 08:10:12">30</Player>
    <Player id="2" timestamp="11/02/2012 09:11:12">40</Player>
  </Players>
</Team>'

DECLARE @XML2 XML = '<Team>
  <Players>
    <Player id="1" timestamp="11/02/2012 09:10:12">10</Player>
    <Player id="2" timestamp="11/03/2012 10:11:12">20</Player>
    <Player id="3" timestamp="11/03/2012 13:00:00">50</Player>
  </Players>
</Team>'

-- extract the ID, Timestamp and node values from both XML variables 
;WITH CTE AS
(
SELECT
    ID = P1.value('@id', 'int'),
    TS = P1.value('@timestamp', 'datetime2'),
    NodeValue = P1.value('(.)[1]', 'int')
FROM @XML1.nodes('/Team/Players/Player') AS XTbl1(P1)

UNION 

SELECT
    ID = P2.value('@id', 'int'),
    TS = P2.value('@timestamp', 'datetime2'),
    NodeValue = P2.value('(.)[1]', 'int')
FROM @XML2.nodes('/Team/Players/Player') AS XTbl2(P2)
),
-- partition and sequentially number the result, so that the newest 
-- (most recent) item can be extracted
CTE2 AS   
(
    SELECT ID, TS, NodeValue,
        RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY TS DESC)
    FROM CTE
)
SELECT 
    ID AS '@id',
    TS AS '@timestamp',
    NodeValue AS 'text()'
FROM CTE2
WHERE RowNum = 1
FOR XML PATH('Player'), ROOT('Players')

输出结果如下:

<Players>
  <Player id="1" timestamp="2012-11-03T08:10:12">30</Player>
  <Player id="2" timestamp="2012-11-03T10:11:12">20</Player>
  <Player id="3" timestamp="2012-11-03T13:00:00">50</Player>
</Players>

关于sql - 同步两个xml文档的tsql代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365616/

相关文章:

sql-server - 表和存储过程的大规模重命名

sql - 如何在递归表(SQL)中获取 2 行的最低公共(public)父级

mysql - Sql 选择不同计数

sql - rails : Using jquery tokeninput (railscast #258) to create new entries

sql - Tsql Union Query 破坏了我的 asp.net gridview 中的排序

sql-server - 一台服务器上存在几何错误,但具有相同数据的另一台服务器上没有几何错误

mysql - 通过许多行操作查找不同的 id

sql - 如何对 SQL Server 中包含数字的 VARCHAR 列进行排序?

sql - 如何防止查询中出现惰性后台打印?

sql-server - 将日期/时间转换为日期