我如何构建我的 SQL FOR XML PATH queries/sub-queries 来表示我的数据?
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/" 作为每个别名的前缀将它们移动到所需的层次结构中!对于回答我自己的问题,我深表歉意,请随时添加其他答案以进行改进或替代。
几个小时以来一直在敲我的头,是时候听从你们这些专家了。我正在构建一些采购订单数据的 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/" 作为每个别名的前缀将它们移动到所需的层次结构中!对于回答我自己的问题,我深表歉意,请随时添加其他答案以进行改进或替代。