簡體   English   中英

如何構造我的SQL FOR XML PATH查詢/子查詢來表示我的數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM