簡體   English   中英

將插入的值與臨時表合並,而忽略空值

[英]Merge inserted values against temp table leaving out null values

在我的過程中,我需要創建一個INSTEAD OF INSERT觸發器,該觸發器將接受記錄的新值並為其創建新版本,例如:

注意:由於業務需求,表列會不斷變化。 因此,如果有一種解決方案將支持table to table合並而不是column to column合並,那就太棒了。

ExampleTable

VersionID   |ID     |Value 1    |Value 2
1           |1      |abc        | 123

查詢示例

INSERT INTO ExampleTable (ID,[Value 1]) VALUES (1,'testabc')

結果表:

VersionID   |ID     |Value 1    |Value 2
1           |1      |abc        | 123
2           |1      |testabc    | 123

在這一刻,我有這樣的事情:

 -- Get data
 SELECT TOP 1 * INTO #ExistingData FROM dbo.ExampleTableLatestVersionView
 WHERE  ID = @ID

 -- Merge incoming data
 MERGE #ExistingData AS target
 USING inserted as source
 ON (target.ID= source.ID)
 WHEN   MATCHED
    THEN UPDATE SET target.[Value 1] = source.[Value 1], 
                    target.[Value 2] = source.[Value 2];

-- And afterwards I do a new insert into version table

這里的問題是inserted表中的NULLinserted被覆蓋,而我最終得到以下結果:

VersionID   |ID     |Value 1    |Value 2
1           |1      |abc        | 123
2           |1      |testabc    | NULL

我當時正在考慮進行INSTEAD OF UPDATE ,通過引用VersionID可以獲取以前的值,但是我想知道是否可行。

如果提供的值為null,則將使用現有值:

 MERGE #ExistingData AS target
 USING inserted as source
 ON (target.ID= source.ID)
 WHEN   MATCHED
    THEN UPDATE SET target.[Value 1] = ISNULL( source.[Value 1],target.[Value 1]), 
                    target.[Value 2] =  ISNULL( source.[Value 2],target.[Value 2]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM