2011-07-04 86 views
0

重复的记录考虑下面的设计:与标识列

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'. 

有什么办法将数据复制正确不涉及游标?

+2

如果您使用SQL Server 2008,则可以使用'merge'代替。看看这个问题http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping-between-source-id-and-target-id。 –

回答

2

谢谢到了Mikael我发现我可以实际使用的MERGE代替INSERT

DECLARE @productRemap 
    TABLE (OldProductId int NOT NULL, NewProductId int NOT NULL) 

-- Duplicate products 
MERGE INTO Product AS t 
USING (
    SELECT * 
    FROM Product 
    WHERE CompanyId = @companyId) AS s 
ON (0 = 1) 
WHEN NOT MATCHED THEN 
    INSERT (ProductName, CompanyId) 
    VALUES (ProductName, @newCompanyId) 
    OUTPUT s.ProductId, inserted.ProductId 
     INTO @productRemap; 

然后,我可以利用@productRemap映射插入ProductPart

MERGE INTO ProductPart AS t 
USING (
    SELECT * FROM ProductPart 
     INNER JOIN @productRemap ON ProductId = OldProductId) AS s 
ON (0 = 1) 
WHEN NOT MATCHED THEN 
    INSERT (ProductId, ProductPartName) 
    VALUES (NewProductId, ProductPartName) 
0

我明白你正在寻找与TSQL严格做到这一点,但是,形式的经验,我发现最简单的一个OldProductId场从添加到Product表和图产品零件:

INSERT INTO Product (ProductName, OldProductId) 
SELECT ProductName, ProductId 
FROM Product 
WHERE CompanyId = @companyId 
+0

不幸的是,我不能添加任何额外的列到'产品'表 – Regent