Рассмотрим следующий дизайн:
Company TABLE (
CompanyId int NOT NULL IDENTITY PRIMARY KEY,
CompanyName nvarchar(max))
Product TABLE (
ProductId int NOT NULL IDENTITY PRIMARY KEY,
CompanyId int NOT NULL,
ProductName nvarchar(max))
ProductPart TABLE (
ProductPartId int NOT NULL IDENTITY PRIMARY KEY,
ProductId int NOT NULL,
ProductPartName)
Мне нужно продублировать данные компании (с CompanyId == @companyId
), чтобы они содержали точно такие же данные.
Первый шаг очевиден:
INSERT INTO Company(CompanyName)
SELECT @newCompanyName
FROM Company
WHERE CompanyId = @companyId
DECLARE @newCompanyId = SCOPE_IDENTITY()
Без таблицы ProductPart
было бы тривиально скопировать и данные Product
:
INSERT INTO Product (ProductName)
SELECT ProductName
FROM Product
WHERE CompanyId = @companyId
Но для правильного дублирования данных ProductPart
мне нужноиметь данные о сопоставлении продуктов между старыми и новыми компаниями.
Я пытался использовать предложение OUTPUT
, но, к сожалению, оно не поддерживает мой сценарий:
DECLARE @productRemap TABLE (OldProductId int NOT NULL, NewProductId int NOT NULL PRIMARY KEY)
INSERT INTO Product (ProductName)
OUTPUT ProductId, inserted.ProductId
INTO @productRemap
SELECT ProductName
FROM Product
WHERE CompanyId = @companyId
-- Invalid column name 'ProductId'.
Есть ли способ скопироватьданные правильно без использования курсоров?