2012-09-13 54 views
0

我有一个这样的XML:MERGE命令插入或更新

<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类型参数传递到其中对其进行解析,并在单独的列中存储的值的存储的过程一个表 - PieceID, OperatorID, MachineID, Status是列。

如果该存储过程不存在或者如果该块已经存在于表X中,则该存储过程必须插入​​每个片段。在上面的示例中,一旦操作员修复了机器中的错误并重新开始工作,状态可能为PieceID 0002确定。在这种情况下,PieceID=0001应该被忽略。

我知道如果只有一块要处理(SQL Server 2008中的MERGE命令?),该怎么办?我无法让我的头脑高效地做几百件。

请为这个问题提出一个有效的方法。谢谢。

回答

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)