我如何构建我的 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/" 作为每个别名的前缀将它们移动到所需的层次结构中!对于回答我自己的问题,我深表歉意,请随时添加其他答案以进行改进或替代。