[英]How do I architect my SQL FOR XML PATH queries/sub-queries to represent my data?
數小時不停地敲打我的腦袋,有時間請您幫忙。 我正在構造一些采購訂單數據的XML表示,這是我需要的格式:
<Orders xmlns="http://...">
<Order>
<Header>
<OrderHeader>
<TradingPartnerId></TradingPartnerId>
<PurchaseOrderNumber></PurchaseOrderNumber>
<TsetPurposeCode></TsetPurposeCode>
<PrimaryPOTypeCode></PrimaryPOTypeCode>
<PurchaseOrderDate></PurchaseOrderDate>
<Vendor></Vendor>
</OrderHeader>
<PaymentTerms>
<TermsDescription></TermsDescription>
</PaymentTerms>
<Dates>
<DateTimeQualifier></DateTimeQualifier>
<Date></Date>
</Dates>
<Address>
<AddressTypeCode></AddressTypeCode>
</Address>
</Header>
<LineItem>
<OrderLine>
<BuyerPartNumber></BuyerPartNumber>
<VendorPartNumber></VendorPartNumber>
<OrderQty></OrderQty>
<OrderQtyUOM></OrderQtyUOM>
<PurchasePrice></PurchasePrice>
</OrderLine>
<ProductOrItemDescription>
<ProductCharacteristicCode></ProductCharacteristicCode>
<ProductDescription></ProductDescription>
</ProductOrItemDescription>
</LineItem>
<LineItem>
<OrderLine>
<BuyerPartNumber></BuyerPartNumber>
<VendorPartNumber></VendorPartNumber>
<OrderQty></OrderQty>
<OrderQtyUOM></OrderQtyUOM>
<PurchasePrice></PurchasePrice>
</OrderLine>
<ProductOrItemDescription>
<ProductCharacteristicCode></ProductCharacteristicCode>
<ProductDescription></ProductDescription>
</ProductOrItemDescription>
</LineItem>
<Summary>
<TotalAmount></TotalAmount>
<TotalLineItemNumber></TotalLineItemNumber>
</Summary>
</Order>
</Orders>
到目前為止,這是我的查詢(嘗試阻止尖叫聲...):
SELECT
(
SELECT
(
SELECT
LTRIM(RTRIM(VENDORNO)) AS "TradingPartnerId",
LTRIM(RTRIM(PONUMBER)) AS "PurchaseOrderNumber",
'00' AS "TsetPurposeCode",
'SA' AS "PrimaryPOTypeCode",
LTRIM(RTRIM(REPLACE(CONVERT(date, DATEX, 102), '.', '-'))) AS "PurchaseOrderDate",
LTRIM(RTRIM(VENDORNO)) AS "Vendor"
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('OrderHeader'), TYPE
),
(
SELECT
'30' AS "TermsDescription"
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('PaymentTerms'), TYPE
),
(
SELECT
LTRIM(RTRIM(REQDATETYPE)) AS "DateTimeQualifier",
LTRIM(RTRIM(REPLACE(CONVERT(date, REQDATE, 102), '.', '-'))) AS "Date"
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('Dates'), TYPE
),
(
SELECT
'ST' AS "AddressTypeCode"
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('Address'), TYPE
)
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('Header'), TYPE
),
(
SELECT
(
SELECT
EDPNO AS "BuyerPartNumber",
VENDORNO AS "VendorPartNumber",
POQTY AS "OrderQty",
'EA' AS "OrderQtyUOM",
ACTUALCOST AS "PurchasePrice"
FROM [ECOMLIVE].[dbo].[PODETAILS]
WHERE PONUMBER = 100203130
FOR XML PATH ('OrderLine'), TYPE
)
FROM [ECOMLIVE].[dbo].[PODETAILS]
WHERE PONUMBER = 100203130
FOR XML PATH ('LineItem'), TYPE
)
FROM [ECOMLIVE].[dbo].[POHEADER]
WHERE PONUMBER = 100203130
FOR XML PATH ('Order'), ROOT ('Orders'), TYPE
在進入LineItem部分之前,我一直做得很好。 當查詢去抓取8個訂單項時,它會創建適當的8個元素,但錯誤地將8個元素放在其中。 像這樣:
格式錯誤:
<LineItem>
<OrderLine>
<a></a>
</OrderLine>
<OrderLine>
<b></b>
</OrderLine>
<OrderLine>
<c></c>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<a></a>
</OrderLine>
<OrderLine>
<b></b>
</OrderLine>
<OrderLine>
<c></c>
</OrderLine>
</LineItem>
...
正確格式:
<LineItem>
<OrderLine>
<a></a>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<b></b>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<c></c>
</OrderLine>
</LineItem>
...
感謝您的時間!
好的,這可能不是最好的解決方案,但是這是我解決的方法:
這個:
...
(
SELECT
(
SELECT
EDPNO AS "BuyerPartNumber",
VENDORNO AS "VendorPartNumber",
POQTY AS "OrderQty",
'EA' AS "OrderQtyUOM",
ACTUALCOST AS "PurchasePrice"
FROM [ECOMLIVE].[dbo].[PODETAILS]
WHERE PONUMBER = 100203130
FOR XML PATH ('OrderLine'), TYPE
)
FROM [ECOMLIVE].[dbo].[PODETAILS]
WHERE PONUMBER = 100203130
FOR XML PATH ('LineItem'), TYPE
)
...
被替換為:
...
(
SELECT
EDPNO AS "OrderLine/BuyerPartNumber",
VENDORNO AS "OrderLine/VendorPartNumber",
POQTY AS "OrderLine/OrderQty",
'EA' AS "OrderLine/OrderQtyUOM",
ACTUALCOST AS "OrderLine/PurchasePrice"
FROM [ECOMLIVE].[dbo].[PODETAILS]
WHERE PONUMBER = 100203130
FOR XML PATH ('LineItem'), TYPE
)
...
將“ OrderLine /”作為前綴添加到每個別名中,將它們移動到所需的層次結構中! 對於回答我自己的問題,我深表歉意,隨時可以添加其他答案以進行改進或替代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.