首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在SQL Server 2014中创建具有多个子节点的XML输出

在SQL Server 2014中创建具有多个子节点的XML输出
EN

Stack Overflow用户
提问于 2018-05-31 00:13:00
回答 2查看 550关注 0票数 2

我正在尝试使用SQL创建一个XML输出。我可以很好地使用基本列表,但不能使用列表中的列表。基本结构:

代码语言:javascript
复制
CREATE TABLE #TEMP1 (   ID1     INT
                        ,Names VARCHAR(10)
                        ,Address VARCHAR(50)
                )

Create Table #TEMP2 ( ID2 INT
                        ,ID1 INT
                        ,ITEM VARCHAR(10)
                        ,Quantity INT
                    )

INSERT INTO #TEMP1 (ID1,Names,Address)
VALUES (1,'Jack','Main St')
        ,(2,'Jill','Second St')
        ,(3,'Hill','3rd St')

INSERT INTO #TEMP2(ID2,ID1,ITEM,Quantity)
Values (1,1,'Curds',20)
        ,(2,2,'Way',30)
        ,(3,2,'Curds',40)
        ,(4,3,'Curds',50)
        ,(5,3,'Curds',60)
        ,(6,3,'Curds',70)

当我运行下面的XML时,我得到了想要的结果:

代码语言:javascript
复制
SELECT ID1      CusID
        ,Names  CusName
        ,Address    PrimAddress
FROM #TEMP1 Customer
FOR XML AUTO, ELEMENTS

<Customer>
    <CusID>1</CusID>
    <CusName>Jack</CusName>
    <PrimAddress>Main St</PrimAddress>
</Customer>
<Customer>
    <CusID>2</CusID>
    <CusName>Jill</CusName>
    <PrimAddress>Second St</PrimAddress>
</Customer>
<Customer>
    <CusID>3</CusID>
    <CusName>Hill</CusName>
    <PrimAddress>3rd St</PrimAddress>
</Customer>

当我尝试将订单(#TEMP2)添加到混合中时,出现了问题。

代码语言:javascript
复制
SELECT ID1      CusID
        ,Names  CusName
        ,Address    PrimAddress
        ,(SELECT ID2 PRODUCTID
                ,ITEM   PRODUCTNAME
                ,Quantity
            FROM #TEMP2 Items
            where ID1 = Customer.ID1
            FOR XML AUTO, ELEMENTS)
FROM #TEMP1 Customer
FOR XML AUTO, ELEMENTS

OutPut有一堆特殊的字符符号,而不是干净的XML:

代码语言:javascript
复制
 <Customer>
    <CusID>1</CusID>
    <CusName>Jack</CusName>
    <PrimAddress>Main St</PrimAddress>&lt;Items&gt;&lt;PRODUCTID&gt;1&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Curds&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;20&lt;/Quantity&gt;&lt;/Items&gt;</Customer>
<Customer>
    <CusID>2</CusID>
    <CusName>Jill</CusName>
    <PrimAddress>Second St</PrimAddress>&lt;Items&gt;&lt;PRODUCTID&gt;2&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Way&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;30&lt;/Quantity&gt;&lt;/Items&gt;&lt;Items&gt;&lt;PRODUCTID&gt;3&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Curds&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;40&lt;/Quantity&gt;&lt;/Items&gt;</Customer>
<Customer>
    <CusID>3</CusID>
    <CusName>Hill</CusName>
    <PrimAddress>3rd St</PrimAddress>&lt;Items&gt;&lt;PRODUCTID&gt;4&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Curds&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;50&lt;/Quantity&gt;&lt;/Items&gt;&lt;Items&gt;&lt;PRODUCTID&gt;5&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Curds&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;60&lt;/Quantity&gt;&lt;/Items&gt;&lt;Items&gt;&lt;PRODUCTID&gt;6&lt;/PRODUCTID&gt;&lt;PRODUCTNAME&gt;Curds&lt;/PRODUCTNAME&gt;&lt;Quantity&gt;70&lt;/Quantity&gt;&lt;/Items&gt;</Customer>

期望的结果类似于下面的内容。可能不是完美的XML,但要点是删除所有特殊字符(而不是试图进行替换或类似的操作):

代码语言:javascript
复制
<Customer>
    <CusID>1</CusID>
    <CusName>Jack</CusName>
    <PrimAddress>Main St</PrimAddress>
        <Items>
            <PRODUCTID>1</PRODUCTID>
            <PRODUCTNAME>Curds</PRODUCTNAME>
            <Quantity>20</Quantity>
        </Items>
</Customer>
<Customer>
    <CusID>2</CusID>
    <CusName>Jill</CusName>
    <PrimAddress>Second St</PrimAddress>
    <Items>
        <Item></Item>
        <PRODUCTID>2</PRODUCTID>
        <PRODUCTNAME>Way</PRODUCTNAME>
        <Quantity>30</Quantity>
        </Item>
    </Items>
    <Items>
        <PRODUCTID>3</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>40</Quantity>
    </Items>
</Customer>
EN

回答 2

Stack Overflow用户

发布于 2018-05-31 02:24:50

我很想看到它添加了遍历项目的逻辑,但我认为这是可行的。

代码语言:javascript
复制
Select 
(SELECT ID1     CusID
        ,Names  CusName
        ,Address    PrimAddress
        ,(SELECT ID2 PRODUCTID
                ,ITEM   PRODUCTNAME
                ,Quantity
            FROM #TEMP2 Items
            where ID1 = Customer.ID1
            FOR XML PATH(''), TYPE, ELEMENTS) AS Items
FROM #TEMP1 Customer
FOR XML AUTO, ELEMENTS) 

也谢谢你:https://www.codeproject.com/Articles/54584/Controlling-the-XML-output-when-using-the-FOR-XML

票数 0
EN

Stack Overflow用户

发布于 2018-06-03 05:17:23

我想这就是你要找的:

代码语言:javascript
复制
CREATE TABLE #TEMP1 (    ID1     INT
                        ,Names VARCHAR(10)
                        ,Address VARCHAR(50)
                )

Create Table #TEMP2 ( ID2 INT
                     ,ID1 INT
                     ,ITEM VARCHAR(10)
                     ,Quantity INT
                    )

INSERT INTO #TEMP1 (ID1,Names,Address)
VALUES (1,'Jack','Main St')
        ,(2,'Jill','Second St')
        ,(3,'Hill','3rd St')

INSERT INTO #TEMP2(ID2,ID1,ITEM,Quantity)
Values (1,1,'Curds',20)
        ,(2,2,'Way',30)
        ,(3,2,'Curds',40)
        ,(4,3,'Curds',50)
        ,(5,3,'Curds',60)
        ,(6,3,'Curds',70);

SELECT ID1 AS CusID
      ,Names AS CusName
      ,[Address] AS PrimAddress
      ,(SELECT items.ID2 AS PRODUCTID
              ,items.ITEM AS PRODUCTNAME
              ,items.Quantity
        FROM #TEMP2 Items
        WHERE items.ID1 = Customer.ID1
        FOR XML PATH('Item'),ROOT('Items'), TYPE) AS [*]
FROM #TEMP1 Customer
FOR XML PATH('Customer'),ROOT('Customers');

结果

代码语言:javascript
复制
<Customers>
  <Customer>
    <CusID>1</CusID>
    <CusName>Jack</CusName>
    <PrimAddress>Main St</PrimAddress>
    <Items>
      <Item>
        <PRODUCTID>1</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>20</Quantity>
      </Item>
    </Items>
  </Customer>
  <Customer>
    <CusID>2</CusID>
    <CusName>Jill</CusName>
    <PrimAddress>Second St</PrimAddress>
    <Items>
      <Item>
        <PRODUCTID>2</PRODUCTID>
        <PRODUCTNAME>Way</PRODUCTNAME>
        <Quantity>30</Quantity>
      </Item>
      <Item>
        <PRODUCTID>3</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>40</Quantity>
      </Item>
    </Items>
  </Customer>
  <Customer>
    <CusID>3</CusID>
    <CusName>Hill</CusName>
    <PrimAddress>3rd St</PrimAddress>
    <Items>
      <Item>
        <PRODUCTID>4</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>50</Quantity>
      </Item>
      <Item>
        <PRODUCTID>5</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>60</Quantity>
      </Item>
      <Item>
        <PRODUCTID>6</PRODUCTID>
        <PRODUCTNAME>Curds</PRODUCTNAME>
        <Quantity>70</Quantity>
      </Item>
    </Items>
  </Customer>
</Customers>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50609277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档