从 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 F0123F0789 下得到,我不希望这样,每个号码应该是不同的航班描述。 【参考方案1】:

在两个 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');

【讨论】:

嗨,伙计,如果我想将 与 2 个航班号合并怎么办?我想要: F0123F0789 然后在 FlightDescription 级别创建空节点:'' 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 路径格式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server xml 路径中的 XML 格式

sql2008存储过程可以直接根据json生成表吗

使用Mysqli从SQL生成XML

PHP生成和获取XML格式数据

如何从数据库表中生成xml文件?

如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?