Я искал, и мне еще не удалось найти пример использования слияния для заполнения связанных таблиц.
Могут использоваться таблицы Northwind DB Order
& OrderDetail
. (В нашем сценарии наши таблицы имеют 3 уровня глубины.)
Для простоты, скажем, у нас есть следующие таблицы.
Заказы
OrderID PK
OrderNumber
Детали_Заказов
OrderID - PK
OrderLineItemNumber PK - FK to Orders.OrderID field
OrderDetailDetails
OrderID - PK - FK to OrderDetails.OrderID
OrderLineItemNumber - PK - FK to OrderDetails.OrderLineItemNumber
OrderSequenceNumber - PK
Кроме того, в этом сценарии записи записываются в промежуточные таблицы, которые идентичны таблицам выше. Для слияния потребуется объединить записи из 3 промежуточных таблиц с 3 соответствующими рабочими таблицами.
Производственные Order
таблицы OrderId
не будут использовать промежуточное значение Order
таблиц OrderId
.
Таким образом, если выполняются условия слияния, то в таблицу Order
должна быть вставка для генерации OrderId
(с идентификатором), поскольку для строк OrderDetail
& OrderDetailDetails
, необходимых для быть создан.
Прямо сейчас я написал сервис на C #, который делает все это, но это не так эффективно.
MERGE
было обнаружено, поэтому мы изучаем его, чтобы посмотреть, можно ли его использовать в такой ситуации, как эта. Любые советы или указатели будут с благодарностью.
Спасибо.
Редактировать: я теперь использую значения хранилища вывода во временной таблице с именем @ MergeOutput.
Declare @MergeOutput Table
(
ActionType varchar(10),
InsertedOrderId int,
StagingOrderID int,
DeletedOrderId int
);
However, I need to do a Merge on all 3 tables. (Order, OrderDetail & OrderDetailDetails)
Also, these tables have more fields than just the Id's.
So I've started creating the 2nd Merge for the OrderDetail table.
MERGE OrderDetail AS OD
USING(
SELECT OrderID,
OrderLineItemNumber,
ProductId
FROM OrderDetail AS OD
where OrderId IN (Select StagingOrderID from @MergeOutput where ActionType = 'INSERT'
) AS src(OrderID,
OrderLineItemNumber,
ProductId
)
ON (OD.OrderId = src.Order AND OD.OrderLineItemNumber = src.OrderLineItemNumber)
WHEN NOT MATCHED By Target THEN
INSERT INTO <-- (This doesn't work no matter what I've tried so far.)
Select (Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId
;
Я вижу следующие ошибки с кодом выше.
"Неверный синтаксис рядом с ключевым словом" в "
Мне нужна функциональность Merge для перемещения записей по всем 3 таблицам
Похоже, я наконец-то начал работать. Мне пришлось изменить оператор вставки следующим образом.
Insert(OrderId, OrderLineItemId, ProductID)
Values((Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId)
Я уже пробовал этот оператор вставки ранее. Я только что понял, что должен был обернуть выбранные парены ().
Спасибо всем за помощь. Я надеюсь, что смогу перенести это в слияние для 3-го стола.