我正在尝试使用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);
答案 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生成源数据。