在SQL Server 2014中创建具有多个子节点的XML输出
我正在尝试使用SQL创建XML输出。我能很好地处理基本列表,但不能处理列表中的列表。基本结构:在SQL Server 2014中创建具有多个子节点的XML输出,sql,sql-server,xml,sql-server-2014,Sql,Sql Server,Xml,Sql Server 2014,我正在尝试使用SQL创建XML输出。我能很好地处理基本列表,但不能处理列表中的列表。基本结构: CREATE TABLE #TEMP1 ( ID1 INT ,Names VARCHAR(10) ,Address VARCHAR(50) ) Create Table #TEMP2 ( ID2 INT ,ID1
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时,我得到了期望的结果:
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>
输出有一组特殊字符符号,而不是干净的XML:
<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><PRODUCTID>2</PRODUCTID><PRODUCTNAME>Way</PRODUCTNAME><Quantity>30</Quantity></Items><Items><PRODUCTID>3</PRODUCTID><PRODUCTNAME>Curds</PRODUCTNAME><Quantity>40</Quantity></Items></Customer>
<Customer>
<CusID>3</CusID>
<CusName>Hill</CusName>
<PrimAddress>3rd St</PrimAddress><Items><PRODUCTID>4</PRODUCTID><PRODUCTNAME>Curds</PRODUCTNAME><Quantity>50</Quantity></Items><Items><PRODUCTID>5</PRODUCTID><PRODUCTNAME>Curds</PRODUCTNAME><Quantity>60</Quantity></Items><Items><PRODUCTID>6</PRODUCTID><PRODUCTNAME>Curds</PRODUCTNAME><Quantity>70</Quantity></Items></Customer>
1.
杰克
主针脚ProductID1/PRODUCTIDPRODUCTNAMECurds/PRODUCTNAMEQuantity20/Quantity/Items
2.
吉尔
第二组产品ID2/PRODUCTIDPRODUCTNAMEWay/PRODUCTNAMEQuantity30/Quantity/ItemsItemsPRODUCTID3/PRODUCTIDPRODUCTNAMECurds/PRODUCTNAMEQuantity40/Quantity/Items
3.
山丘
第三组产品ID4/PRODUCTIDPRODUCTNAMECurds/PRODUCTNAMEQuantity50/Quantity/ItemsItemsPRODUCTID5/PRODUCTIDPRODUCTNAMECurds/PRODUCTNAMEQuantity60/Quantity/ItemsItemsPRODUCTID6/PRODUCTIDPRODUCTNAMECurds/PRODUCTNAMEQuantity70/Quantity/Items
预期结果如下所示。可能不是完美的XML,但要点是删除所有特殊字符(不要尝试替换或类似操作):
1.
杰克
主街
1.
凝乳
20
2.
吉尔
第二街
2.
方式
30
3.
凝乳
40
希望看到它添加到循环项目的逻辑中,但我认为这是可行的
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)
也谢谢:我想你要找的就是这个:
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');
结果
<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>
1.
杰克
主街
1.
凝乳
20
2.
吉尔
第二街
2.
方式
30
3.
凝乳
40
3.
山丘
第三街
4.
凝乳
50
5.
凝乳
60
6.
凝乳
70
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');
<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>