Объединить вставленные значения с временной таблицей, оставив пустые значения

В моем процессе мне нужно создать 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 ответ

Решение

Это будет использовать существующее значение, если предоставленное значение равно нулю:

 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]);
Другие вопросы по тегам