将插入的值合并到临时表中,省略空值

时间:2014-09-19 16:22:14

标签: sql sql-server merge auto-versioning

在我的过程中,我需要创建一个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

这里的问题是来自NULL表的inserted值被覆盖,我最终得到了这个:

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

我在考虑做INSTEAD OF UPDATE,我可以通过引用VersionID来获取以前的值,但我想知道这是否可行。

1 个答案:

答案 0 :(得分:1)

如果提供的值为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]);