使用 XQuery 连接 XML 个节点
Concat XML nodes using XQuery
我需要以下输出
<name>Thomas Mapother</name>
<name>Tom Cruise</name>
使用以下 XML 使用 XQuery FLOWR 表达式。
INSERT INTO XMLO1 VALUES ('<Contact>
<Names>
<Name Type = "Legal">
<First>Thomas</First>
<Middle>T</Middle>
<Last>Mapother</Last>
</Name>
<Name Type = "Stage">
<First>Tom</First>
<Middle>C</Middle>
<Last>Cruise</Last>
</Name>
</Names>
</Contact>')
我尝试了以下查询。但它 returns 不同的输出。
SELECT xDoc.query('let $names := Contact/Names/Name
return <name>{
for $x in $names
return ($x/First,$x/Last)}
</name>')
FROM XMLO1
像这样:
select xDoc.query('
for $x in Contact/Names/Name
return element Name {concat($x/First[1]," ", $x/Last[1])}
')
from XMLO1
或切碎并重新组合(会更快):
select T.X.value('(First/text())[1]', 'nvarchar(100)')+' '+
T.X.value('(Last/text())[1]', 'nvarchar(100)')
from XMLO1
cross apply xDoc.nodes('Contact/Names/Name') as T(X)
for xml path('Name');
据此和 ,我认为您对 FLWOR 表达式的工作原理有点困惑。
在另一个问题中,您只想要一个包装元素 (oldPlanes
),但是您错误地在 FLWOR 表达式的 return
子句中创建了该元素,该元素只执行一次对于 for
子句选择的每个节点。在这个问题中,您犯了相反的错误:您希望输入中的每个 Name
有一个 name
元素,因此您需要在 return
子句中生成它。
所以不用
return <name>{
for $x in $names
return ($x/First,$x/Last)}
</name>
你想要
return
for $x in $names
return <name>{($x/First,$x/Last)}</name>
同样,可以简化为
return $names/<name>{(First,Last)}</name>
许多具有 SQL 背景的人都错误地认为每个查询都必须是 FLWOR 表达式。事实上,绝大多数查询不需要变量,也不需要FLWOR。
我需要以下输出
<name>Thomas Mapother</name>
<name>Tom Cruise</name>
使用以下 XML 使用 XQuery FLOWR 表达式。
INSERT INTO XMLO1 VALUES ('<Contact>
<Names>
<Name Type = "Legal">
<First>Thomas</First>
<Middle>T</Middle>
<Last>Mapother</Last>
</Name>
<Name Type = "Stage">
<First>Tom</First>
<Middle>C</Middle>
<Last>Cruise</Last>
</Name>
</Names>
</Contact>')
我尝试了以下查询。但它 returns 不同的输出。
SELECT xDoc.query('let $names := Contact/Names/Name
return <name>{
for $x in $names
return ($x/First,$x/Last)}
</name>')
FROM XMLO1
像这样:
select xDoc.query('
for $x in Contact/Names/Name
return element Name {concat($x/First[1]," ", $x/Last[1])}
')
from XMLO1
或切碎并重新组合(会更快):
select T.X.value('(First/text())[1]', 'nvarchar(100)')+' '+
T.X.value('(Last/text())[1]', 'nvarchar(100)')
from XMLO1
cross apply xDoc.nodes('Contact/Names/Name') as T(X)
for xml path('Name');
据此和
在另一个问题中,您只想要一个包装元素 (oldPlanes
),但是您错误地在 FLWOR 表达式的 return
子句中创建了该元素,该元素只执行一次对于 for
子句选择的每个节点。在这个问题中,您犯了相反的错误:您希望输入中的每个 Name
有一个 name
元素,因此您需要在 return
子句中生成它。
所以不用
return <name>{
for $x in $names
return ($x/First,$x/Last)}
</name>
你想要
return
for $x in $names
return <name>{($x/First,$x/Last)}</name>
同样,可以简化为
return $names/<name>{(First,Last)}</name>
许多具有 SQL 背景的人都错误地认为每个查询都必须是 FLWOR 表达式。事实上,绝大多数查询不需要变量,也不需要FLWOR。