2012-05-02 20 views
0

需要移植数据的SQL表需要移植数据SQL子表

我有一个列(masterid, masterdata, year)主表。这里masterid是一个标识列。

我有2012年的,我需要同2012点的数据为2013

我可以通过简单地运行这样一个SQL语句解决问题的数据:

INSERT INTO mastertable 
    SELECT masterdata, 2013 
    FROM mastertable WHERE Year = 2012 

我想运行类似也为儿童表跑。

我的子表结构为:(childid , masterid, childdata

这里我有孩子数据,2012年,我想与在第一步主数据创造了2013年适当masterid为2013年的类似数据。

最好我想有没有添加额外的临时列解决方案

任何主角非常感谢。

Regards, Kumar。

+0

“在这里我有孩子的数据2012年,我想为2013年类似的数据与主数据创造了2013年的第一个步骤正确masterid。”它不是很清楚2013年的 – Maddy

+0

我有mastertable创建的行。我需要在子表中使用在主表中创建的正确主ID来复制数据,因为子表具有对主表的引用。 – Brainchild

+0

查看OUTPUT子句。 –

回答

0

您需要存储在mastertable表中创建的2013年和2012年记录之间的链接。如果您想在不添加任何附加临时列的情况下实现此目标,则需要使用T-SQL。

(我猜你已经猜到了masterdata的一个varchar(max)类型,因为你没有指定它的类型)。

DECLARE @links TABLE (masterid int, newmasterid int) 
DECLARE @mastertemp TABLE (masterid int, masterdata varchar(max)) 

DECLARE @masterid int, 
     @masterdata varchar(max) 

INSERT INTO @mastertemp 
SELECT  masterid, 
      masterdata 
FROM  mastertable 
WHERE  [year] = 2012 

WHILE EXISTS (SELECT TOP 1 * FROM @mastertemp) 
BEGIN 
    SELECT TOP 1 @masterid = masterid, 
        @masterdata = masterdata 
    FROM   @mastertemp 

    INSERT INTO mastertable 
    VALUES (@masterdata, 2013) 

    INSERT INTO @links 
    VALUES (@masterid, SCOPE_IDENTITY()) 

    DELETE FROM @mastertemp 
    WHERE  masterid = @masterid 
END 

INSERT INTO childtable 
SELECT  l.newmasterid, 
      c.childdata 
FROM  childtable c 
INNER JOIN @links l ON c.masterid = l.masterid 
+0

您的解决方案绝对正确。检查任何选项以避免临时表和while循环。 – Brainchild

+0

@kumar:据我所知,没有临时表或创建临时列是不可能的。 – weenoid

0

假设ChildId是标识列具有自动增量

可以在函数/存储过程中包裹起来,而不需要临时表。

修订

Declare @Year  int 

SET @Year = 2011 

INSERT INTO MasterTable 
SELECT masterdata, 2013 
FROM mastertable WHERE Year = @Year 

INSERT INTO childtable 
SELECT SCOPE_IDENTITY(), c.childdata 
FROM childtable c 
WHERE masterid in 
(
    SELECT masterid 
    FROM masterTable 
    WHERE Year = @Year 
) 
+0

这不会设置正确的'childtable.masterid'值,他们仍然会指向2012年的记录。你的查询所做的事实质上是复制了那里已有的“子表”数据。 – weenoid

+0

同意Weenoid。 – Brainchild

+0

查看我的更新回答 – Turbot

相关问题