2012-04-17 34 views
1

私は、1つのテーブルに別のテーブルでALLLEDGERENTRIES.LIST詳細をバウチャーの詳細を保存しています以下の複雑なXMLSQL Serverで複雑なXMLSのためのOpenXML()を使用する方法2005

<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> 

を持っています。

どちらのテーブルも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 @[email protected]@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に保存されているが、SalesLedgerテーブルの列VoucherIDは、すべての行に対して同じである(それはいけない...)私はそれが最後に戻っている@@IDENTITYを使用してアイデンティティ価値のみ。

誰かが私はおそらくこれを行うには、SQL ServerのネイティブのXQueryの機能を使用することになり

+0

」サブノードが両方とも**同一であることは間違いですか?もう一度まったく同じノードに出会ったらどうしますか?データを2回挿入しますか? –

答えて

0

... SQLでopenxml()を使用してSalesLedger表にvoucherID関連を保存する方法を、私を助けてください。まず、SalesVoucherテーブルに必要なアイテムを取得し、それらを挿入します。

詳細を入力すると、「親」情報はすでにSalesVoucherテーブルに保存されています。そこで必要な情報を取得してください。

あなたのコードは(あなたのXMLデータは、タイプXML@inputと呼ばれるSQL変数であると仮定して)このようなものになるだろう:

-- 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への参照をする必要がある - その情報を、あなたはSalesVoucherからAbsIDを取得することができますし、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) 

CROSS APPLYはその特定のノードの詳細を取得し、上記のXMLのVoucherNumberの「親」情報に詳細を「接続」します。 PSなどのよう

DECIMAL(18,0)のデータ型が-2678.9985ような値には適していないあります。 DECIMAL(18,0)には最大18桁が格納されますが、小数点の後にの0が格納されます。この値は-2679として保存されます。これを、より有用なデータ型のDECIMAL(18,4)に変更しました。小数点以下4桁の最大18桁です。

関連する問題