SQL Merge不插入新行

时间:2018-05-21 10:37:16

标签: sql sql-server tsql merge

我正在尝试使用T-SQL Merge检查是否存在记录并更新,如果没有则插入。

更新工作正常,但插入不起作用。

我们将非常感激地收到任何有关这方面的帮助。

DECLARE
    @OperatorID          INT         = 2,
    @CurrentCalendarView VARCHAR(50) = 'month';

WITH CTE AS 
(
    SELECT * 
    FROM dbo.OperatorOption 
    WHERE OperatorID = @OperatorID
)
MERGE INTO OperatorOption AS T
USING CTE S ON T.OperatorID = S.OperatorID

WHEN MATCHED THEN 
   UPDATE 
       SET T.CurrentCalendarView = @CurrentCalendarView

WHEN NOT MATCHED BY TARGET THEN 
    INSERT (OperatorID, PrescriptionPrintingAccountID, CurrentCalendarView)
    VALUES (@OperatorID, NULL, @CurrentCalendarView);

3 个答案:

答案 0 :(得分:2)

OperatorOption中的OperatorOption中的行已选何时不存在?

如果你说这段代码没有插入 - 你是对的不是因为行必须在那里开始(在这种情况下它不会插入),或者行不在那里首先,在这种情况下,源数据集中没有任何内容可以插入。

SELECT * 
FROM dbo.OperatorOption 
WHERE OperatorID = @OperatorID

是否退货?

这不会像你想象的那样奏效。源CTE中没有任何内容。

“目标中缺少空白数据集”的答案是“否”,因此未插入任何内容

要执行此操作,我使用此构造:

INSERT INTO dbo.OperatorOption 
(OperatorID, PrescriptionPrintingAccountID, CurrentCalendarView)
SELECT @OperatorID, NULL, @CurrentCalendarView 
WHERE NOT EXISTS (
    SELECT * FROM dbo.OperatorOption 
    WHERE OperatorID = @OperatorID
    )

答案 1 :(得分:1)

将值作为变量插入并不重要。它认为没有什么可插入的。

您需要生成不匹配的数据。

像这样:

DECLARE @OperatorID INT = 3, @CurrentCalendarView VARCHAR(50) = 'month';
declare @t table (operatorID int, CurrentCalendarView varchar(50));
insert into @t values (2, 'year');

MERGE @t AS TARGET
USING (SELECT @OperatorID, @CurrentCalendarView) AS source (operatorID, CurrentCalendarView)
   on (TARGET.operatorID = Source.operatorID)
WHEN MATCHED THEN 
   UPDATE SET TARGET.CurrentCalendarView = @CurrentCalendarView    
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (OperatorID, CurrentCalendarView)
    VALUES (source.OperatorID, source.CurrentCalendarView);

select * from @t

答案 2 :(得分:0)

插入可能不起作用,因为源CTE不会产生任何行。根据表的组织方式,您可能需要从其他来源中进行选择,或使用table valued constructor生成源数据。