在我的过程中,我需要创建一个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
来获取以前的值,但我想知道这是否可行。
答案 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]);