Sql server 2008 SQL Server 2008合并软删除错误

Sql server 2008 SQL Server 2008合并软删除错误,sql-server-2008,merge,Sql Server 2008,Merge,我正在尝试使用SQLServer2008Merge命令对目标表中的一行执行软删除 我认为这应该属于“when not matched by source”部分,因为源代码缺少行,而目标代码仍然有行。我想做的就是将IsActive位设置为false,但是我得到了一个错误 “正在尝试将不可为NULL的列的值设置为NULL。” 我错过了什么 用户表为: [ID] [nvarchar](50) NOT NULL, [FirstName] [nvarchar](200) NULL, [LastName]

我正在尝试使用SQLServer2008Merge命令对目标表中的一行执行软删除

我认为这应该属于“when not matched by source”部分,因为源代码缺少行,而目标代码仍然有行。我想做的就是将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;

似乎您的临时表
TempUserTable
IsActive
列或
ID
列中有一个
NULL

您可以让它完全按照您的需要工作,但对我来说,我需要在不匹配的行中添加一个条件

所以,试试像

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

我也有同样的问题。将查询转换为两个单独的insert或update语句解决了此问题。。或者我应该说,我把它挡在了一边。。