从按列而非行组织的 SQL 创建 XML

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

我正在寻找一种有效的方法来生成按 SQL Server 2016 原始数据列分组的 XML 输出,针对特定的输出格式。

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

我能做到:

Declare @Try XML
set @Try =(
select('<Answer name = "FirstName">'+(select FirstName as 'value'from @tbl order by ID
for xml PATH(''), Root('repeat'), ELEMENTS XSINIL)+'</Answer>'
) 
+
(select('<Answer name = "MiddleName">'+(select MiddleName as 'value'from @tbl order by ID
for xml PATH(''), Root('repeat'), ELEMENTS XSINIL) +'</Answer>'
)
+
(select('<Answer name = "LastName">'+(select LastName as 'value'from @tbl order by ID
for xml PATH(''), Root('repeat'), ELEMENTS XSINIL) +'</Answer>'
)
)
)
)
select @Try

获得:

<Answer name="FirstName">
  <repeat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <value>Fred</value>
    <value>Anna</value>
  </repeat>
</Answer>
<Answer name="MiddleName">
  <repeat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <value>A.</value>
    <value xsi:nil="true" />
  </repeat>
</Answer>
<Answer name="LastName">
  <repeat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <value>Smith</value>
    <value>Polack</value>
  </repeat>
</Answer>

我可以通过转换为文本并替换 xmlns 内容来获得所需的输出,即:

<Answer name="FirstName">
  <repeat>
    <value>Fred</value>
    <value>Anna</value>
  </repeat>
</Answer>
<Answer name="MiddleName">
  <repeat>
    <value>A.</value>
    <value xsi:nil="true" />
  </repeat>
</Answer>
<Answer name="LastName">
  <repeat>
    <value>Smith</value>
    <value>Polack</value>
  </repeat>
</Answer>

但是必须有一种更有效的方法来生成此输出而无需显式查询每一列(我的实际数据集有很多列)。

sql sql-server xml xquery
© www.soinside.com 2019 - 2024. All rights reserved.