1

サード パーティに転送するために XML で請求書の詳細を返す SP を作成しようとしています。

私は動作している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 を返す複数のストアド プロシージャを呼び出すことは可能ですか?

4

1 に答える 1

3

単一のステートメント内で XML を返す複数のストアド プロシージャを呼び出すことは可能ですか?

いいえ。ただし、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>
于 2013-05-16T10:47:58.153 に答える