看下表(一个非常简化的例子):
CREATE TABLE [dbo].[tbl_Order_Lines] (
[LineID] [int] IDENTITY(1, 1) NOT NULL ,
[OrderID] [int] NOT NULL ,
[StockCode] [varchar](20) NOT NULL ,
[Quantity] [smallint] NOT NULL
)
我有一个控制插入该表的过程,但有一次你会遇到臭名昭著的“UPSERT”场景。
假设我的过程具有以下变量:
@OrderID INT ,
@StockCode VARCHAR(20) ,
@Quantity SMALLINT
我目前执行以下操作:
IF ( NOT EXISTS ( SELECT *
FROM [dbo].[tbl_Order_Lines]
WHERE [OrderID] = @OrderID
AND [StockCode] = @StockCode )
)
INSERT INTO [dbo].[tbl_Order_Lines]
( [OrderID] ,
[StockCode] ,
[Quantity]
)
VALUES ( @OrderID ,
@StockCode ,
@Quantity
)
ELSE
UPDATE [dbo].[tbl_Order_Lines]
SET Quantity = @Quantity
WHERE [OrderID] = @OrderID
AND [StockCode] = @StockCode
我的意图是废除这种旧方法并使用该MERGE
声明 - 但是我正在努力理解该MERGE
声明,这就是我到目前为止所拥有的:
MERGE dbo.tbl_Order_Lines
USING (
VALUES
( @Quantity
) ) AS Source ( Quantity )
ON dbo.tbl_Order_Lines.OrderID = @OrderID AND StockCode = @StockCode
WHEN MATCHED THEN
UPDATE SET Quantity = source.Quantity
WHEN NOT MATCHED THEN
INSERT (
OrderID ,
StockCode ,
Quantity
) VALUES
( @OrderID ,
@StockCode ,
Source.Quantity
);
我的问题:
- 我在这方面的尝试
MERGE
似乎奏效了——但它看起来非常混乱和混乱——有没有更好的方法来写这个? - 我将如何修改此
MERGE
语句以DELETE
匹配行(基于OrderID
&StockCode
)if @Quantity = 0