MERGE命令,包含多行以插入或更新

时间:2012-09-13 18:44:06

标签: xml sql-server-2008 merge insert-update

我有这样的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类型参数传递到存储过程,该存储过程对其进行解析并将值存储在表中的单独列中 - PieceID, OperatorID, MachineID, Status作为列。

如果每个部分不存在,则此存储过程必须插入​​每个部分;如果该部分已存在于表X中,则必须更新。在上面的示例中,一旦操作员修复了机器中的错误并重新运行作业,状态可能会变为PieceID 0002。在这种情况下,应忽略PieceID=0001

我知道如果在SQL Server 2008中只有一个进程(MERGE命令?),该怎么做?我无法高效地做好几百件。

请为此问题提出有效方法。谢谢。

1 个答案:

答案 0 :(得分: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)