如何使用 XQuery-sql 在 XML 中查找祖先
how to find ancestors in XML using XQuery-sql
我正在处理一些 xml 列,我使用 XQuery 查找特定子项(子项 E)的第一个最近的祖先 (B),但出现此错误:
Msg 9335, Level 16, State 1, Line 16 XQuery [query()]: The XQuery
syntax 'ancestor' is not supported.
祖先和后代的深度级别不是静态的,我希望结果是"B2"
我试过了
DECLARE @x xml
SET @x = CAST(
'<A>
<B name="B1">
<C>
<B id="1" name="B2">
<D id="1.1" name="D1">
<E id="1" />
<E id="2" />
</D>
</B>
</C>
</B>
</A>' AS xml)
SELECT @x.query('data(//E/ancestor::B[1]/@name)')
你能帮帮我吗?
DECLARE @h int
DECLARE @x xml
SET @x = CAST(
'<A>
<B name="B1">
<C>
<B id="1" name="B2">
<D id="1.1" name="D1">
<E id="1" />
<E id="2" />
</D>
</B>
</C>
</B>
</A>' AS xml)
EXEC sp_xml_preparedocument @h OUTPUT, @x
SELECT eId, bName
FROM OPENXML(@h, '//E', 2)
WITH
(
eId varchar(5) '@id',
bName varchar(5) 'ancestor::B[1]/@name')
EXEC sp_xml_removedocument @h
您可以尝试使用不同的方法来避免调用 ancestor
轴,例如:
SELECT @x.query('data(//B[.//E][not(.//B)]/@name)')
关于正在使用的谓词的简要说明:
[.//E]
:确保目标 B
元素具有后代元素 E
[not(.//B)]
:确保目标 B
元素没有后代元素 B
,换句话说,目标 B
元素必须是具有后代 E
的最内层 B
元素
我正在处理一些 xml 列,我使用 XQuery 查找特定子项(子项 E)的第一个最近的祖先 (B),但出现此错误:
Msg 9335, Level 16, State 1, Line 16 XQuery [query()]: The XQuery syntax 'ancestor' is not supported.
祖先和后代的深度级别不是静态的,我希望结果是"B2" 我试过了
DECLARE @x xml
SET @x = CAST(
'<A>
<B name="B1">
<C>
<B id="1" name="B2">
<D id="1.1" name="D1">
<E id="1" />
<E id="2" />
</D>
</B>
</C>
</B>
</A>' AS xml)
SELECT @x.query('data(//E/ancestor::B[1]/@name)')
你能帮帮我吗?
DECLARE @h int
DECLARE @x xml
SET @x = CAST(
'<A>
<B name="B1">
<C>
<B id="1" name="B2">
<D id="1.1" name="D1">
<E id="1" />
<E id="2" />
</D>
</B>
</C>
</B>
</A>' AS xml)
EXEC sp_xml_preparedocument @h OUTPUT, @x
SELECT eId, bName
FROM OPENXML(@h, '//E', 2)
WITH
(
eId varchar(5) '@id',
bName varchar(5) 'ancestor::B[1]/@name')
EXEC sp_xml_removedocument @h
您可以尝试使用不同的方法来避免调用 ancestor
轴,例如:
SELECT @x.query('data(//B[.//E][not(.//B)]/@name)')
关于正在使用的谓词的简要说明:
[.//E]
:确保目标B
元素具有后代元素E
[not(.//B)]
:确保目标B
元素没有后代元素B
,换句话说,目标B
元素必须是具有后代E
的最内层
B
元素