从 SQL 表生成 XML 路径格式
Posted
技术标签:
【中文标题】从 SQL 表生成 XML 路径格式【英文标题】:Generate XML path format from SQL table 【发布时间】:2020-02-10 09:42:50 【问题描述】:我试图从 SQL 表中获取 XML:
我的桌子
------------
-- Table1 --
------------
ID Flight1 Flight2
--------------------------
1 F0123 F0789
2 F0345 F0678
Query:
Select
A.[ID],
A.[Flight1] as "FlightDescription/Number",
A.[Flight2] as "FlightDescription/Number"
from
[Table1] A
for xml path('Flight'), root('Flights')
我的预期结果是:
<Flights>
<Flight>
<ID>1</ID>
<FlightDescription>
<Number>F0123</Number>
</FlightDescription>
<FlightDescription>
<Number>F0789</Number>
</FlightDescription>
</Flight>
<Flight>
<ID>2</ID>
<FlightDescription>
<Number>F0345</Number>
</FlightDescription>
<FlightDescription>
<Number>F0678</Number>
</FlightDescription>
</Flight>
</Flights>
但我得到的是这个:
<Flights>
<Flight>
<ID>1</ID>
<FlightDescription>
<Number>F0123F0789</Number>
</FlightDescription>
</Flight>
<Flight>
<ID>2</ID>
<FlightDescription>
<Number>F0345F0678</Number>
</FlightDescription>
</Flight>
</Flights>
我可以弄清楚...在我的表格中,每个 ID 都有超过 4 个航班号,所以我想知道是否有办法让所有这些都以我需要的方式。
提前致谢!
【问题讨论】:
你真的可以指定两次相同的列别名吗? 如果我指定不同的别名,我将在 FlightDescription在两个 FlightDescription/Number 元素/节点之间创建一个空节点。
declare @f table
(
Id int,
Flight1 varchar(20),
Flight2 varchar(20)
);
insert into @f(Id, Flight1, Flight2)
values
(1, 'F0123', 'F0789'),
(2, 'F0345', 'F0678');
Select
A.[ID],
A.[Flight1] as 'FlightDescription/Number',
'',
A.[Flight2] as 'FlightDescription/Number'
from
@f A
for xml path('Flight'), root('Flights');
【讨论】:
嗨,伙计,如果我想将'' AS 'FlightDescription',
【参考方案2】:
这是另一种稍微复杂的方法。 XQuery 及其 FLWOR 表达式。通过这种方式,您可以显式地塑造您的 XML。它很容易创建、理解、进行任何修改并在以后进行维护。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT PRIMARY KEY, Flight1 VARCHAR(20), Flight2 VARCHAR(20));
INSERT INTO @tbl (ID, Flight1, Flight2) VALUES
(1, 'F0123', 'F0789'),
(2, 'F0345', 'F0678');
-- DDL and sample data population, end
SELECT (
SELECT *
FROM @tbl
FOR XML PATH('r'), TYPE, ROOT('root')).query('<Flights>
for $x in /root/r
return <Flight>
$x/ID
<FlightDescription>
<number>data($x/Flight1)</number>
<number>data($x/Flight2)</number>
</FlightDescription>
</Flight>
</Flights>'
);
输出
<Flights>
<Flight>
<ID>1</ID>
<FlightDescription>
<number>F0123</number>
<number>F0789</number>
</FlightDescription>
</Flight>
<Flight>
<ID>2</ID>
<FlightDescription>
<number>F0345</number>
<number>F0678</number>
</FlightDescription>
</Flight>
</Flights>
【讨论】:
检查执行计划和过多的内存授予...为什么从数据和xquery创建xml而不是直接从数据创建xml? 我完全明白你在说什么。我们在同一页上。但是,稍作修改,OP就完全丢失了。这不仅仅关乎性能。 lptr,请在 LinkedIn 上与我联系以上是关于从 SQL 表生成 XML 路径格式的主要内容,如果未能解决你的问题,请参考以下文章