1

Techies--正しいノードの正しい要素を選択する際に問題なくXmlオブジェクトを細断処理していますが、本当に必要なときに単一の値を保持している詳細識別子を適切に更新する必要がありますやるべきことは、その値を書き込んだばかりの値で更新することです。私は現在のシュレッディング プロセスの効率性が気に入っています。このロジックを修正する最善の方法を教えてください。

何が起こっているかは次のとおりです。

  -- Given:
  -- @OrderXml  is an incoming, populated order containg the header, 
                -- subheaders and    detail records

  -- This logic succeeds
  -- step #1: write the header  row in the header table 
  insert into [order].OrderHeader
  ( col.cone,
    col.ctwo)
  select
   Order.detail.value('(cone/text())[1]','varchar(2)'),
   Order.detail.value('(ctwo/text()) [1]','varchar(2)')
    from @OrderXml.nodes('/Order') as Order(detail)

  select @OrderId = scope_identity()

  -- This logic succeeds
  -- step #2: write the subheader rows in the subheader table

 insert into [order].OrderSubHeader
(col.OrderId,
 col.xone,
 col.xtwo)
select
@OrderId,        -- this works, because no matter how many subheader rows
                -- get generated, the same order id needs to be associated with it.

OrderSub.detail.value('(xone/text())[1]','varchar(2)'),
OrderSub.detail.value('(xtwo/text()) [1]','varchar(2)')
from @OrderXml.nodes('/Order/SubHeader'') as OrderSub(detail)

SELECT @OrderSubId = SCOPE_IDENTITY()


-- This logic FAILS
-- step #3: write the detail rows in the detail table

insert into [order].OrderDetail
(col.OrderId,
 col.OrderSubId,  
 col.yone,
 col.ytwo)
  select
   @OrderId,        -- this is correct
   @OrderSubId,     -- this is WRONG when there are multiples
   OrderDet.detail.value('(yone/text())[1]','varchar(2)'),
   OrderDet.detail.value('(ytwo/text()) [1]','varchar(2)')
  from @OrderXml.nodes('/Order/SubHeader/Detail'') as OrderDet(detail)
4

1 に答える 1

1

OUTPUT句を確認してください。OrderSubHeaderに挿入しているときに、OrderDetailテーブルに挿入する他の値に加えてinserted.OrderSubIDをキャプチャできます。次に、そのキャプチャされたデータ(一時テーブルまたはテーブル変数内)を使用して、OrderDetailに挿入します。

于 2012-10-08T17:28:47.650 に答える