gpt4 book ai didi

sql-server - 使用 SQL Server 迭代 XML "cousins"

转载 作者:数据小太阳 更新时间:2023-10-29 01:54:48 30 4
gpt4 key购买 nike

我将以下 XML 文档存储在 XML 类型的 TSQL 变量中:

<root>
<parent>
<child>Alice</child>
<child>Bob</child>
<child>Carol</child>
</parent>
<house>
<room><id>1</id></room>
<room><id>2</id></room>
<room><id>3</id></room>
</house>
</root>

我想遍历“表亲”节点(即,其 parent 是 sibling 的节点)并在表中每次迭代插入一行,每个表亲插入一列。所以结果会是这样的:

Child | Room
------------
Alice | 1
Bob | 2
Carol | 3

(我知道房间和 child 一样多)。

我觉得这是一个简单的任务,但似乎找不到方法。我是 SQL Server 和 XPath 的初学者,可能缺乏查找文档的术语。

到目前为止,我尝试过的是迭代,比如说 child 元素,并尝试使用 ROW_NUMBER< 从那里读取匹配的 room 元素 选择我想要的房间:

INSERT INTO children (child, room)
SELECT
child = T.Item.value('(../parent/child/text())[' + (ROW_NUMBER() OVER(ORDER BY T.Item)) + ']', 'VARCHAR(10)'),
room = T.Item.value('(id/text())[1]', 'CHAR(1)')
FROM
@XML.nodes('root/house/room') AS T(Item)

但是 SQL 服务器提示 value() 只接受字符串文字作为第一个参数(这是什么限制??)。

知道如何简单地做到这一点吗?

最佳答案

不确定这是最好的还是最短的方法,但它会产生您需要的输出:

DECLARE @x XML='
<root>
<parent>
<child>Alice</child>
<child>Bob</child>
<child>Carol</child>
</parent>
<house>
<room><id>1</id></room>
<room><id>2</id></room>
<room><id>3</id></room>
</house>
</root>';

;WITH childs AS (
SELECT
n.e.value('.','NVARCHAR(128)') AS child,
id=ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
@x.nodes('/root/parent/child') AS n(e)
),
room_ids AS (
SELECT
n.e.value('.','NVARCHAR(128)') AS room_id,
id=ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
@x.nodes('/root/house/room/id') AS n(e)
)
SELECT
c.child,
r.room_id
FROM
childs AS c
INNER JOIN room_ids AS r ON
r.id=c.id
ORDER BY
c.id;

关于sql-server - 使用 SQL Server 迭代 XML "cousins",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957655/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com