SQL Merge не вставляет новую строку - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь использовать 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 голосов
/ 21 мая 2018

Когда строка Выбранный из OperatorOption еще не существует в OperatorOption?

Если вы говорите, что этот код не вставляется - вы правы, что нетt потому что строка должна быть там для начала (в этом случае она не будет вставлена), или строка не там для начала, и в этом случае в исходном наборе данных нет ничего для вставки.

1009 *

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
    )
0 голосов
/ 21 мая 2018

Неважно, что вы вводите значения как переменные.Он думает, что вставлять нечего.

Вам необходимо создать данные, которые не совпадают.

Примерно так:

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
0 голосов
/ 21 мая 2018

Вставка, вероятно, не работает, потому что ваш исходный CTE не производит никаких строк.В зависимости от того, как организована ваша таблица, вам может потребоваться выбрать другой источник или использовать табличный конструктор для получения исходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...