简体   繁体   English

在 SQL 中拆分 XML 报告

[英]Split XML report in SQL

I have below SQL stored procedure which generates a report and sends to me via email.我有下面的 SQL 存储过程,它生成报告并通过 email 发送给我。 However it sends all the various rows as one big chunk report.然而,它将所有不同的行作为一个大块报告发送。 Rather I would want it to split each error Any idea how I can split the below query to have individual XML reports generated.相反,我希望它拆分每个错误知道如何拆分以下查询以生成单独的 XML 报告。

DECLARE @Report XML
BEGIN
    
    UPDATE [Orders].dbo.PurOrd
    SET [Status] = 'Failed', Reason = '<e id="0" message="failed test order" />'
    WHERE [Status] = 'InProcess' 
    SET @Report = (
        SELECT 
            
            p.Name as "@Name",
            p.Customer "@Customer",
            CASE p.Name
                WHEN 'Default' THEN convert(xml,p.RejectedReason)
                ELSE convert(xml,f.RejectedReason)
            END AS "RejectedReason",
            (
                SELECT u.first_name as "@FirstName",
                u.last_name as "@LastName",
                FROM [Users].dbo.Users u
                WHERE u.user_id = u.user_id
                for xml PATH('Users'), type
            ),
            (
                SELECT
                li.Product as "@PId",
                li.Quantity as "@Quantity",
                li.SalePrice as "@Price",
                FROM [Cart].dbo.LineItems li
                WHERE li.OrderFormId = f.OrderFormId
                ORDER BY li.ItemNumber
                for xml PATH('LineItem'), type
            )
        FROM [Orders].dbo.OrForms f
            JOIN [Orders].dbo.PurOrd p on f.GroupId = p.GroupId
        WHERE 
            (p.Status = 'OrderRejected' AND p.ReportStatus IS NULL)
        FOR XML PATH('test'), TYPE
    )
SELECT @Report FOR XML PATH('Report')

Current Output:当前 Output:

<Report>
<PurchaseOrder OrderId="Order 1" Name="name1" Seller="abc">
    <Reason>
      <errors>
        <e id="0" message="failed test ord" />
      </errors>
    </Reason>
    <Users FirstName="abc" LastName="xyz"/>
    <LineItem ProductId="Clothes1" Quantity="1.0000" SalePrice="100rs"/>
</PurchaseOrder>
<PurchaseOrder OrderId="Order 2" Name="name 2" Seller="abc">
    <Reason>
      <errors>
        <e id="0" message="failed test ord" />
      </errors>
    </Reason>
    <Users FirstName="abc" LastName="xyz"/>
    <LineItem ProductId="Clothes1" Quantity="1.0000" SalePrice="100rs"/>
  </PurchaseOrder>
</Report>

EXPECTED OUTPUT:预期 OUTPUT:

<Report>
<PurchaseOrder OrderId="Order 1" Name="name1" Seller="abc">
    <Reason>
      <errors>
        <e id="0" message="failed test ord" />
      </errors>
    </Reason>
    <Users FirstName="abc" LastName="xyz"/>
    <LineItem ProductId="Clothes1" Quantity="1.0000" SalePrice="100rs"/>
</PurchaseOrder>
</Report>
<Report>
<PurchaseOrder OrderId="Order 2" Name="name 2" Seller="abc">
    <Reason>
      <errors>
        <e id="0" message="failed test ord" />
      </errors>
    </Reason>
    <Users FirstName="abc" LastName="xyz"/>
    <LineItem ProductId="Clothes1" Quantity="1.0000" SalePrice="100rs"/>
  </PurchaseOrder>
</Report>

One way to get一种获取方式

<Report>
   <PurchaseOrder ... >
     ...
   </PurchaseOrder>
</Report>
<Report>
   <PurchaseOrder ...>
    ...
   </PurchaseOrder>
</Report>

structure is to wrap your select list into CROSS APLLY.结构是将您的 select 列表包装到 CROSS APLLY 中。 Kind of有点儿

    SELECT t.PurchaseOrder
    FROM [Orders].dbo.OrForms f
    JOIN [Orders].dbo.PurOrd p on f.GroupId = p.GroupId
    CROSS APPLY (
      SELECT
        -- original select list copy
        p.Name as "@Name",
        p.Customer "@Customer",
        CASE p.Name
            WHEN 'Default' THEN convert(xml,p.RejectedReason)
            ELSE convert(xml,f.RejectedReason)
        END AS "RejectedReason",
        (
            SELECT u.first_name as "@FirstName",
            u.last_name as "@LastName",
            FROM [Users].dbo.Users u
            WHERE u.user_id = u.user_id
            for xml PATH('Users'), type
        ),
        (
            SELECT
            li.Product as "@PId",
            li.Quantity as "@Quantity",
            li.SalePrice as "@Price",
            FROM [Cart].dbo.LineItems li
            WHERE li.OrderFormId = f.OrderFormId
            ORDER BY li.ItemNumber
            for xml PATH('LineItem'), type
        )
        -- original select list copy END          
      FOR XML PATH(''), TYPE
    ) t(PurchaseOrder)
    WHERE 
        (p.Status = 'OrderRejected' AND p.ReportStatus IS NULL)
    FOR XML PATH('Report'), TYPE;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM