Объединить вставленные значения с временной таблицей, оставив пустые значения
В моем процессе мне нужно создать 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]);