我有这样的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
命令?),该怎么做?我无法高效地做好几百件。
请为此问题提出有效方法。谢谢。
答案 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)