0

私はこのようなXMLを持っています:

<Job>
<Piece PieceID="0001">
  <OperatorID>O1</OperatorID>
  <MachineID>M1</MachineID>
<Status>OK</Status>
</Piece>
<Piece PieceID="0002">
  <OperatorID>O1</OperatorID>
  <MachineID>M1</MachineID>
<Status>ERROR</Status>
</Piece>
</Job>

このXMLは、XML型パラメーターを介してストアドプロシージャに渡されます。ストアドプロシージャは、XMLを解析し、値をテーブル内の個別の列(列)に格納しPieceID, OperatorID, MachineID, Statusます。

このストアドプロシージャは、各ピースが存在しない場合は挿入するか、ピースがテーブルにすでに存在する場合は更新する必要がありますX。上記の例では、オペレーターがマシンのエラーを修正してジョブを再実行すると、ステータスが「OK」として表示される場合がありPieceID 0002ます。その場合、PieceID=0001は無視する必要があります。

処理する部分が1つしかない場合(MERGESQL Server 2008のコマンド?)、これを行う方法を知っています。数百個のピース​​を効率的に実行することに頭を悩ませることはできません。

この問題に対する効率的なアプローチを提案してください。ありがとうございました。

4

1 に答える 1

1

MERGEを使用して、単一の行だけでなく、データのバッチを更新できます。

MERGE [TargetTable]
USING [SourceTable]
ON [TargetTable].PieceId= [SourceTable].PieceId
WHEN MATCHED AND status <> [SourceTable].Status THEN
UPDATE SET status = [SourceTable].Status

また、新しいデータにINSERTを使用できます。

INSERT ..... WHERE PieceId NOT IN (SELECT PieceId FROM targetTable)
于 2012-09-13T23:01:03.570 に答える