【问题标题】:SQL Server 2008 Merge Soft Delete ErrorSQL Server 2008 合并软删除错误
【发布时间】:2009-03-26 17:19:22
【问题描述】:

我正在尝试使用 SQL server 2008 MERGE 命令对目标表中的一行执行软删除。

我认为这应该属于“当与源不匹配时”部分,因为源缺少该行而目标仍然具有它。我想要做的就是将 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;

【问题讨论】:

  • 我遇到了同样的问题。将查询转换为两个单独的插入或更新语句解决了问题。或者我应该说,绕过它..

标签: sql-server-2008 merge


【解决方案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()

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多