2014-07-01 30 views
0

我想从不同的表中复制数据,同时保持彼此之间不同的链接。从table1复制条目,然后从table2复制条目与table1外键

简化我的表的结构:

timetable (pk INT PRIMARY KEY IDENTITY(1,1), name VARCHAR(50)) 
timetable_group (pk INT PRIMARY KEY IDENTITY(1,1), timetable_fk INT, name VARCHAR(50)) 
timetable_class (pk INT PRIMARY KEY IDENTITY(1,1), timetable_fk INT, timetable_group_fk INT, name VARCHAR(50)) 

我的目标是能够时间表的条目与所有timetable_group和timetable_class内的相关条目的复制。复制timetable_class

如何从timetable_group复制并取回插入PKS能够使用它们:

INSERT@@IDENTITY得到@new_timetable_fk后,我打我的问题呢?

我尝试使用这样的:

-- This is a parameter to my code 
DECLARE @timetable_fk INT 
SET @timetable_fk = 1 

-- start of my Stored Procedure 

-- this will hold my new timetable_fk 
DECLARE @new_timetable_fk INT 

-- this will hold the old and new pks of timetable_group 
-- so we can join on it 
DECLARE @timetable_group_link_pks TABLE (new_pk INT, old_pk INT) 

-- copy the timetable entry 
INSERT INTO timetable (name) 
SELECT LEFT(name + ' copy', 50) 
FROM timetable 
WHERE pk = @timetable_fk 

-- get the pk of the newly inserted value 
SET @new_timetable_fk = @@IDENTITY 


-- copy timetable_group 
INSERT INTO timetable_group (timetable_fk, name) 
-- This return the error `The multi-part identifier "g.pk" could not be bound` 
OUTPUT inserted.pk, g.pk 
    INTO @timetable_group_link_pks 
SELECT @new_timetable_fk, g.name 
FROM timetable_group g 
WHERE g.timetable_fk = @timetable_fk 

-- copy timetable class 
INSERT INTO timetable_class (timetable_fk, timetable_group_fk, name) 
SELECT @new_timetable_fk, gl.new_pk, c.name 
FROM timetable_class c 
    JOIN @timetable_group_link_pks gl ON c.timetable_group_fk = gl.old_pk 
WHERE c.timetable_fk = @timetable_fk 

但正如我不能OUTPUT子句中使用g.pk这是行不通的。

MSDN告诉我们OUTPUT子句应该按我的意思工作,但TSQL不接受它。

任何想法如何解决这个问题?

+0

我把我在代码中的注释得到了错误。 无法绑定多部分标识符“g.pk” –

回答

2

你应该使用MERGE语句与输出条款,而不是插入沿着直接, 请参阅Link

+0

即使它看起来像一个可行的解决方案,我也不太喜欢合并 –

0

的g.pk不会在“输出”的存在是因为“插入”,并选择查询是不会自动加入。

你可以跳过@timetable_group_link_pks表和OUTPUT的东西,你不需要它。

这应该工作:

-- copy timetable_group 
INSERT INTO timetable_group (timetable_fk, name) 
SELECT @new_timetable_fk, g.name 
FROM timetable_group g 
WHERE g.timetable_fk = @timetable_fk 

-- copy timetable_class 
INSERT INTO timetable_class (timetable_fk, timetable_group_fk, name) 
SELECT @new_timetable_fk, c.timetable_group_fk, c.name 
FROM timetable_class c 
join timetable_group g on g.timetable_fk = c.timetable_fk 
WHERE c.timetable_fk = @timetable_fk and g.pk = @timetable_fk 
+0

这是行不通的,因为您最终会使用旧的group_fk而不是复制一个。 –

+0

啊,真的。没有想到,通过适当的:P – jokedst

相关问题