採取如下表(一個非常簡單的例子):使用SQL MERGE與瓦爾而不是表
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
);
我的問題(S):
- 我在這個
MERGE
嘗試似乎工作 - 但它看起來非常凌亂和混亂 - 有沒有寫這更好的辦法? - 我將如何修改這個
MERGE
聲明DELETE
匹配的行(基於OrderID
&StockCode
)if @Quantity = 0