Sql server SQL Server表中的XML嵌套
这对于SQL Server来说可能听起来很愚蠢,但我正在寻找帮助,指导我如何在SQL Server中编写for XML查询,以便将表导出为非常特定的嵌套格式。我正在导入信息的程序需要这样做,否则它将无法正常工作 这是我正在使用的表的示例 下面是我正在寻找的输出。我可以用这个查询生成单行,但是我希望嵌套它,使它看起来像下面的示例。我不知道如何使XML包装器成为字段中的值。将要使用此功能的终端软件只能使用带有数字的ID,因此我必须以我现在的方式对其进行格式化。希望有人能对此提供指导和指导Sql server SQL Server表中的XML嵌套,sql-server,xml,Sql Server,Xml,这对于SQL Server来说可能听起来很愚蠢,但我正在寻找帮助,指导我如何在SQL Server中编写for XML查询,以便将表导出为非常特定的嵌套格式。我正在导入信息的程序需要这样做,否则它将无法正常工作 这是我正在使用的表的示例 下面是我正在寻找的输出。我可以用这个查询生成单行,但是我希望嵌套它,使它看起来像下面的示例。我不知道如何使XML包装器成为字段中的值。将要使用此功能的终端软件只能使用带有数字的ID,因此我必须以我现在的方式对其进行格式化。希望有人能对此提供指导和指导 SELEC
SELECT *
FROM Tbl_Store
FOR XML Path('Store')
<STORE>
<box1>
<item1>
<size>10</size>
<weight>15</weight>
</item1>
<item2>
<size>20</size>
<weight>25</weight>
</item2>
<item3>
<size>30</size>
<weight>35</weight>
</item3>
<item4>
<size>40</size>
<weight>45</weight>
</item4>
<item5>
<size>50</size>
<weight>55</weight>
</item5>
</box1>
<box2>
<item1>
<size>10</size>
<weight>15</weight>
</item1>
<item2>
<size>20</size>
<weight>25</weight>
</item2>
<item3>
<size>30</size>
<weight>35</weight>
</item3>
<item4>
<size>40</size>
<weight>45</weight>
</item4>
<item5>
<size>50</size>
<weight>55</weight>
</item5>
</box2>
</Store>
首先:对于下一个问题:请不要以图片形式发布数据。把这个打进去可不好玩。。。最好是[mcve],您可以检查我的答案如何在表变量中提供可消费数据 第二:给元素命名是一个非常糟糕的主意。一个人永远不应该做这样的事情
<item1/>
<item2/>
这很管用,但非常难看,我现在得洗手了:-
SELECT CAST(
CONCAT('<Store>'
,(
SELECT CONCAT('<',Box,'>'
,(
SELECT CONCAT('<item',Item,'>'
,'<size>',m2.Size,'</size>'
,'<weight>',m2.[Weight],'</weight>'
,'</item',Item,'>')
FROM @mockup m2
WHERE m2.Box=m.Box
ORDER BY m2.Item
FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
,'</',Box,'>')
FROM @mockup m
GROUP BY m.Box
FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
,'</Store>')
AS XML);
结果接近您需要的结果,但设计合理:
<Store>
<box index="1">
<item index="1">
<size>10</size>
<weight>15</weight>
</item>
<item index="2">
<size>20</size>
<weight>25</weight>
</item>
<item index="3">
<size>30</size>
<weight>35</weight>
</item>
<item index="4">
<size>40</size>
<weight>45</weight>
</item>
<item index="5">
<size>50</size>
<weight>55</weight>
</item>
</box>
<box index="2">
<item index="1">
<size>10</size>
<weight>15</weight>
</item>
<item index="2">
<size>20</size>
<weight>25</weight>
</item>
<item index="3">
<size>30</size>
<weight>35</weight>
</item>
<item index="4">
<size>40</size>
<weight>45</weight>
</item>
<item index="5">
<size>50</size>
<weight>55</weight>
</item>
</box>
</Store>
这是我的第一篇帖子,下次我会采纳你的建议。谢谢你。凌乱的版本可以工作,但我通常使用正确设计的版本,并且能够让它与导入它的应用程序一起工作。为了在读取xml输出时更容易识别,我稍微修改了它,以包含框名。此外,我必须为我要导入的应用程序使用ID,而不是索引。我用底部的定稿编辑了我的问题。现在只需要将其作为存储过程导出到文件。
SELECT CAST(
CONCAT('<Store>'
,(
SELECT CONCAT('<',Box,'>'
,(
SELECT CONCAT('<item',Item,'>'
,'<size>',m2.Size,'</size>'
,'<weight>',m2.[Weight],'</weight>'
,'</item',Item,'>')
FROM @mockup m2
WHERE m2.Box=m.Box
ORDER BY m2.Item
FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
,'</',Box,'>')
FROM @mockup m
GROUP BY m.Box
FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
,'</Store>')
AS XML);
<Store>
<box1>
<item1>
<size>10</size>
<weight>15</weight>
</item1>
<item2>
<size>20</size>
<weight>25</weight>
</item2>
<item3>
<size>30</size>
<weight>35</weight>
</item3>
<item4>
<size>40</size>
<weight>45</weight>
</item4>
<item5>
<size>50</size>
<weight>55</weight>
</item5>
</box1>
<box2>
<item1>
<size>10</size>
<weight>15</weight>
</item1>
<item2>
<size>20</size>
<weight>25</weight>
</item2>
<item3>
<size>30</size>
<weight>35</weight>
</item3>
<item4>
<size>40</size>
<weight>45</weight>
</item4>
<item5>
<size>50</size>
<weight>55</weight>
</item5>
</box2>
</Store>
SELECT ROW_NUMBER() OVER(ORDER BY Box) AS [@index]
,(
SELECT m2.Item AS [@index]
,m2.Size AS [size]
,m2.[Weight] AS [weight]
FROM @mockup m2
WHERE m2.Box = m.Box
ORDER BY m2.Item
FOR XML PATH('item'),TYPE
)
FROM @mockup m
GROUP BY m.Box
FOR XML PATH('box'),ROOT('Store')
<Store>
<box index="1">
<item index="1">
<size>10</size>
<weight>15</weight>
</item>
<item index="2">
<size>20</size>
<weight>25</weight>
</item>
<item index="3">
<size>30</size>
<weight>35</weight>
</item>
<item index="4">
<size>40</size>
<weight>45</weight>
</item>
<item index="5">
<size>50</size>
<weight>55</weight>
</item>
</box>
<box index="2">
<item index="1">
<size>10</size>
<weight>15</weight>
</item>
<item index="2">
<size>20</size>
<weight>25</weight>
</item>
<item index="3">
<size>30</size>
<weight>35</weight>
</item>
<item index="4">
<size>40</size>
<weight>45</weight>
</item>
<item index="5">
<size>50</size>
<weight>55</weight>
</item>
</box>
</Store>