在 SQL 中操作标签名称和输出结构

问题描述 投票:0回答:1

我有一个生成一行的 SQL 查询,其中包含来自 Microsoft SQL Server 2016 的多列。

我正在尝试以 XML 格式生成输出,并且可以使用 SQL XML 基本参数来获取以下变体:

<FirstName>Fred</FirstName>
<LastName>Smith</LastName>
..
..
..

我需要的是:

<Answer name=“FirstName”>
  <value>Fred</value>
</Answer>
<Answer name=“LastName”>
  <value>Smith</value>
</Answer>
..
..
..

(我意识到这可能是 XML 的低效结构——我没有设计目标!)

我可能可以通过使用列标签/值和大量显式替换操作来实现所需的功能,但是在开始该路径之前(有很多列!),我想检查一下是否有更直接的方法?

提前致谢。

sql sql-server xml xquery
1个回答
0
投票

没有提供最小的可重现示例。从臀部射击。

亮点:

  • CROSS APPLY
    正在生成一个通用的 XML 而不管表 结构。
  • XQuery FLWOR 表达式正在组成一个精确的所需 XML 输出。

总的来说,答案遵循相同的最小可重现示例模式。你按原样将它复制到 SSMS,它正在工作。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, FirstName VARCHAR(20), LastName VARCHAR(20));
INSERT @tbl (FirstName, LastName) VALUES
('Fred', 'Smith'),
('Anna', 'Polack');
-- DDL and sample data population, end

SELECT ID
    , x.query('for $x in /root/*
        return <Answer name="{local-name($x)}">
          <value>{data($x)}</value>
        </Answer>') AS Result
FROM @tbl AS t
CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(x);

输出

+----+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| ID |                                                                         Result                                                                         |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1 | <Answer name="ID"><value>1</value></Answer><Answer name="FirstName"><value>Fred</value></Answer><Answer name="LastName"><value>Smith</value></Answer>  |
|  2 | <Answer name="ID"><value>2</value></Answer><Answer name="FirstName"><value>Anna</value></Answer><Answer name="LastName"><value>Polack</value></Answer> |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.