我有一个生成一行的 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 的低效结构——我没有设计目标!)
我可能可以通过使用列标签/值和大量显式替换操作来实现所需的功能,但是在开始该路径之前(有很多列!),我想检查一下是否有更直接的方法?
提前致谢。
没有提供最小的可重现示例。从臀部射击。
亮点:
CROSS APPLY
正在生成一个通用的 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> |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------+