1

次の複雑な XML があります。

<Collection>
 <VOUCHER>
      <DATE TYPE="Date">20110401</DATE>
      <NARRATION TYPE="String">MUNNA CONVENT ROAD</NARRATION>
      <VOUCHERTYPENAME>RETAIL</VOUCHERTYPENAME>
      <VOUCHERNUMBER>R-2-I2-9-6-27751</VOUCHERNUMBER>
      <ALLLEDGERENTRIES.LIST>            
           <LEDGERNAME>U.S.T. CANTEEN</LEDGERNAME>
           <AMOUNT>-2678.9985</AMOUNT>
      </ALLLEDGERENTRIES.LIST>
      <ALLLEDGERENTRIES.LIST>            
           <LEDGERNAME>U.S.T. CANTEEN</LEDGERNAME>
           <AMOUNT>-2678.9985</AMOUNT>
      </ALLLEDGERENTRIES.LIST>
 </VOUCHER>
 <VOUCHER>
      <DATE TYPE="Date">20110401</DATE>
      <NARRATION TYPE="String">MUNNA CONVENT ROAD</NARRATION>
      <VOUCHERTYPENAME>RETAIL</VOUCHERTYPENAME>
      <VOUCHERNUMBER>R-2-I2-9-6-27751</VOUCHERNUMBER>
      <ALLLEDGERENTRIES.LIST>            
           <LEDGERNAME>U.S.T. CANTEEN</LEDGERNAME>
           <AMOUNT>-2678.9985</AMOUNT>
      </ALLLEDGERENTRIES.LIST>
      <ALLLEDGERENTRIES.LIST>            
           <LEDGERNAME>U.S.T. CANTEEN</LEDGERNAME>
           <AMOUNT>-2678.9985</AMOUNT>
      </ALLLEDGERENTRIES.LIST>
 </VOUCHER>
</Collection>

バウチャーの詳細を 1 つのテーブルに保存し、ALLLEDGERENTRIES.LIST詳細を別のテーブルに保存しています。

両方のテーブルに関係がありVoucherIDます。特定VoucherIDの場合、関連する x3 値を保存する必要があります。私のストアドプロシージャでは、openxml().

私のSPの一部:

INSERT INTO SalesVoucher(AbsID,VoucherNumber,VoucherTypeName,Narration,VoucherDate)
    SELECT @AID,VOUCHERNUMBER,VOUCHERTYPENAME,NARRATION,CAST(DATE AS DATETIME)
        FROM OPENXML(@XMLHandle,'ENVELOPE/BODY/DATA/COLLECTION/VOUCHER',3) 
        WITH (    
            VOUCHERNUMBER nVarchar(200),VOUCHERTYPENAME varchar(100),NARRATION varchar(500),DATE DATETIME
            )
    SELECT @VID=@@IDENTITY

INSERT INTO SalesLedger(VoucherID,LedgerName,Amount)
    SELECT @VID,LEDGERNAME,AMOUNT
        FROM OPENXML(@XMLHandle,'ENVELOPE/BODY/DATA/COLLECTION/VOUCHER/ALLLEDGERENTRIES.LIST',3)
        WITH(
            LEDGERNAME varchar(200),AMOUNT decimal(18,0)
            )

すべての値はDBに格納されていますがVoucherIDSalesLedgerテーブルの列はすべての行で同じです(そうすべきではありません)。使用@@IDENTITYしたのは最後のID値のみを返すためです。

SQLで使用して関連voucherIDするSalesLedgerテーブルを保存する方法を教えてください...openxml()

4

1 に答える 1

0

これを行うには、おそらく SQL Server のネイティブ XQuery 機能を使用します。SalesVoucherまず、テーブルに必要なアイテムをつかんで挿入します。

詳細を挿入すると、「親」情報が既にSalesVoucherテーブルに保存されているため、そこから必要な情報を取得します。

コードは次のようになります (XML データが@inputtypeという SQL 変数にあると仮定しますXML)。

-- Insert the "parent" info into SalesVoucher
INSERT INTO dbo.SalesVoucher(VoucherNumber, VoucherTypeName, Narration, VoucherDate)
    SELECT
        v.value('(VOUCHERNUMBER)[1]', 'NVARCHAR(200)'),
        v.value('(VOUCHERTYPENAME)[1]', 'VARCHAR(100)'),
        v.value('(NARRATION)[1]', 'VARCHAR(500)'),
        v.value('(DATE)[1]', 'DATETIME')
    FROM 
        @input.nodes('/Collection/VOUCHER') AS Coll(V)

これにより、テーブルに基本情報が挿入されますSalesVoucher

VoucherNumber詳細を解析する場合は、親のへの参照を作成する必要があります。その情報を使用して、AbsIDからを取得しSalesVoucher、適切な値を に挿入できSalesLedgerます。

INSERT INTO @SalesLedger (VoucherID, LedgerName, Amount)
   SELECT
       sv.AbsID,
       AL.LS.value('(LEDGERNAME)[1]', 'VARCHAR(200)'),
       AL.LS.value('(AMOUNT)[1]', 'DECIMAL(18,4)')
   FROM 
       @input.nodes('/Collection/VOUCHER') AS Coll(V)
   INNER JOIN
       dbo.SalesVoucher sv 
           ON sv.VoucherNumber = v.value('(VOUCHERNUMBER)[1]', 'NVARCHAR(200)')
   CROSS APPLY
       Coll.V.nodes('.//ALLLEDGERENTRIES.LIST') AS AL(LS)

はその1 つの特定のノードの詳細を取得し、その詳細を上記の XMLCROSS APPLYの の「親」情報に「接続」します。VoucherNumber

PS のように: のデータ型は のような値にDECIMAL(18,0)は適していません-2678.9985DECIMAL(18,0)は最大 18 桁を格納しますが、小数点以下は 0 である-2679ため、この値は として格納されます。これをより便利なデータ型 (DECIMAL(18,4)最大 18 桁、小数点以下 4 桁) に変更しました。

于 2012-04-17T13:44:30.327 に答える