принять следующую таблицу (очень упрощенный пример):Использование 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
);
Мой вопрос (ы):
- Моя попытка на этом
MERGE
, кажется, работает - но это выглядит очень неаккуратно и сбивает с толку - есть лучший способ написания этого? - Как бы я изменить это
MERGE
заявление вDELETE
соответствующих строк (на основеOrderID
&StockCode
)if @Quantity = 0