2013-05-16 50 views
1

我正在嘗試編寫一個SP來返回XML中的發票細節以轉移給第三方。使用存儲過程簡化XML生成

我有一個工作SP但它是一個有點亂(以下簡化):

SELECT ( 
    SELECT GETDATE() AS HEADER_SLAStartTime 
     , DATEADD(HOUR, @SLA_HOURS, GETDATE()) AS HEADER_SLAEndTime 
    FOR XML PATH ('Header'), TYPE 

    ) , (

     SELECT ACCT AS CustomerCode 
      , ACCTNAME As CustomerName 
      , ADDR#1 As AddressLine1 
      , ADDR#2 AS AddressLine2 
      , ADDR#3 AS AddressLine3 
      , ADDR#4 AS AddressLine4 
      , POSTCODE AS AddressPostcode 
      , TELNO AS AddressTelno 

     FROM InvHdr 

     WHERE INVNO = @INVNO 

     FOR XML PATH('Customer'), TYPE 

    ) , (

     SELECT (
      SELECT INVNO AS InvoiceNo 
       , [DATE] AS InvoiceDate 
       , [INVTYPE] AS InvoiceType 
       , CASE [SOURCE] WHEN 0 THEN 'Contract' WHEN 1 THEN 'Manual' WHEN 2 THEN 'Sales Order' ELSE '' END AS InvoiceSourceText 
       , THEIRREF AS CustomerReference 
       , YOURREF AS InternalReference 
       , (
        SELECT ITEMNO AS ItemCode 
         , [ITEMDESC#1] AS ItemDesc 
         , [TYPE] AS ItemType 
         , [MEMO] AS ItemMemo 
         , [GOODS] AS ItemCharge 
         , [DISCOUNT] AS ItemDiscount 

        FROM InvItems 

        WHERE INVNO = HDR.INVNO 

        FOR XML PATH('InvItem'), TYPE 
        ) 

      FROM InvHdr HDR 

      WHERE INVNO = @INVNO 

      FOR XML PATH('InvoiceHeader'), TYPE 

     ) , (

      SELECT HDR.[GOODS] AS InvoiceNet 
       , HDR.VAT AS InvoiceVAT 
       , HDR.[GOODS] + HDR.VAT AS InvoiceGross 
       , (

        SELECT VATCODE AS VATListCode 
         , VATAMT AS VATListAmount 
         , VATDESC AS VATListDescription 
         , VATRATE AS VATListRate 
         , VATGOODS AS VATListGoods 

        FROM InvVAT 

        WHERE InvVAT.INVNO = HDR.INVNO 

        ORDER BY VATAMT DESC 

        FOR XML PATH('VATSummary'), TYPE 
        ) 
      FROM InvHdr HDR 

      WHERE INVNO = @INVNO 

      FOR XML PATH('InvoiceFooter'), TYPE 
     ) 
     FOR XML PATH('Invoices'), TYPE 


    ) 
FOR XML PATH(''), ROOT('Output') 

這個過程的作品,但我必須創造大量的這些得到的不同訂單的信息不同的位,我曾嘗試創建單獨的SP公司得到的部分數據,下面是我的第一部分SP:

CREATE PROCEDURE UDEF_DC_XML_INVOICEFOOTER(
    @INVNO INT 
    ) 

AS 

BEGIN 


    SELECT HDR.[GOODS] AS InvoiceNet 
     , HDR.VAT AS InvoiceVAT 
     , HDR.[GOODS] + HDR.VAT AS InvoiceGross 
     , (

      SELECT VATCODE AS VATListCode 
       , VATAMT AS VATListAmount 
       , VATDESC AS VATListDescription 
       , VATRATE AS VATListRate 
       , VATGOODS AS VATListGoods 

      FROM InvVAT 

      WHERE InvVAT.INVNO = HDR.INVNO 

      ORDER BY VATAMT DESC 

      FOR XML PATH('VATSummary'), TYPE 
      ) 
    FROM InvHdr HDR 

    WHERE INVNO = @INVNO 

    FOR XML PATH('InvoiceFooter'), TYPE 


END 

當我嘗試調用此:

SELECT UDEF_DC_XML_INVOICEFOOTER(@INVNO) 
FOR XML PATH('Invoices'), TYPE 

我得到的錯誤:

Msg 4121, Level 16, State 1, Line 1 
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.UDEF_DC_XML_INVOICEFOOTER", or the name is ambiguous. 

在我希望能夠創建多個4/5線SP的,將調用正確的順序所有節結束。通過按順序調用單個SP或將每個部分寫入變量並在之後構建完整的XML。

是否有可能在單個語句中調用多個存儲過程返回XML?

+0

「使用存儲過程來簡化XML的一代」 - 這難道不是個方面的矛盾?!? –

回答

3

Is it possible to call multiple stored procedures returning XML within a single statement?

不,但您可以使用返回XML的函數。

create function dbo.GetXML(@Value int) returns xml 
as 
begin 
    return (
     select @Value as X 
     for xml path('Y'), type 
     ) 
end 

使用這樣的:

select dbo.GetXML(1) 
for xml path('Z') 

結果:

<Z> 
    <Y> 
    <X>1</X> 
    </Y> 
</Z> 
+0

看起來很理想,你可以嵌套函數調用來生成嵌套的XML嗎? – bendataclear

+0

@bendataclear是的。 [類似這樣](http://sqlfiddle.com/#!3/bb0f7/1) –

+0

完美,感謝您的幫助! – bendataclear