Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server表中的XML嵌套_Sql Server_Xml - Fatal编程技术网

Sql server SQL Server表中的XML嵌套

Sql server SQL Server表中的XML嵌套,sql-server,xml,Sql Server,Xml,这对于SQL Server来说可能听起来很愚蠢,但我正在寻找帮助,指导我如何在SQL Server中编写for XML查询,以便将表导出为非常特定的嵌套格式。我正在导入信息的程序需要这样做,否则它将无法正常工作 这是我正在使用的表的示例 下面是我正在寻找的输出。我可以用这个查询生成单行,但是我希望嵌套它,使它看起来像下面的示例。我不知道如何使XML包装器成为字段中的值。将要使用此功能的终端软件只能使用带有数字的ID,因此我必须以我现在的方式对其进行格式化。希望有人能对此提供指导和指导 SELEC

这对于SQL Server来说可能听起来很愚蠢,但我正在寻找帮助,指导我如何在SQL Server中编写for XML查询,以便将表导出为非常特定的嵌套格式。我正在导入信息的程序需要这样做,否则它将无法正常工作

这是我正在使用的表的示例

下面是我正在寻找的输出。我可以用这个查询生成单行,但是我希望嵌套它,使它看起来像下面的示例。我不知道如何使XML包装器成为字段中的值。将要使用此功能的终端软件只能使用带有数字的ID,因此我必须以我现在的方式对其进行格式化。希望有人能对此提供指导和指导

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>