2009-03-26 21 views
1

SQL Server 2008 MERGEコマンドを使用して、ターゲットテーブルの行に対してソフト削除を実行しようとしています。SQL Server 2008マージソフト削除エラー

ソースには行がないため、ターゲットにはまだそれがあるため、これは「ソースと一致しない場合」セクションに該当するはずです。私がしたいのは、IsActiveビットをfalseに設定することですが、エラーが発生します。

"NULLに設定できない列の値をNULLに設定しようとしています。

私は何が欠けていますか?

Usersテーブルがある:

[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

何かを試してみてください。 2つの別々の挿入または更新ステートメントにクエリを変換する問題を解決しました..または私は、サイドステップを言わなければならない.. –

答えて

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

あなたの一時テーブルTempUserTableIsActive列またはID列でNULLを持っているいずれかのように見えます。