2009-03-26 4 views
1

Я пытаюсь выполнить мягкое удаление в строке в моей целевой таблице с помощью команды MERGE SQL Server 2008.Ошибка SQL Server 2008 Merge Soft Delete

Я думаю, что это должно подпадать под раздел «когда не соответствует источнику», так как источнику не хватает строки, а цель все еще имеет его. Все, что я хочу сделать, это установить бит IsActive в false, но я получаю сообщение об ошибке.

«Попытка установить значение столбца, отличного от NULL, до NULL».

Что мне не хватает?

В таблице пользователей:

[ID] [nvarchar](50) NOT NULL, 
[FirstName] [nvarchar](200) NULL, 
[LastName] [nvarchar](200) NULL, 
[EmailAddress] [nvarchar](200) NULL, 
[IsActive] [bit] NOT NULL 

Оператор Merge является:

merge into Users 
using TempUserTable lu 
on Users.ID = TempUserTable.ID 
when matched then 
update set 
    ID = lu.ID, 
    FirstName = lu.FirstName, 
    LastName = lu.LastName, 
    EMailAddress = lu.EmailAddress, 
    IsActive = lu.Status 

when not matched then 
    insert (ID, FirstName, LastName, EmailAddress, IsActive) 
    values (lu.ID, lu.FirstName, lu.LastName, lu.EmailAddress, lu.Status) 
when not matched by source then 
    update set IsActive = 0; 
+0

У меня та же проблема. Преобразование запроса в два отдельных оператора вставки или обновления разрешило проблему. Или я должен сказать, перешагнул ее. –

ответ

1

может получить это, чтобы работать точно так, как вы хотите, но для меня мне нужно было добавить условие в строку NOT MATCHED.

Так попробовать что-то вроде ...

WHEN NOT MATCHED BY SOURCE 
        AND TARGET.[IsActive] = 1 
        AND TARGET.[DeletedOn] IS NULL 
    THEN UPDATE 
    SET 
     TARGET.[IsActive] = 0, 
     TARGET.[DeletedOn] = SYSDATETIMEOFFSET() 
0

Оказывается, что ваша таблица TempUserTable темпа либо имеет NULL в IsActive колонки или ID столбца.