Sql 复制表1中的条目,然后使用表1外键复制表2中的条目

Sql 复制表1中的条目,然后使用表1外键复制表2中的条目,sql,sql-server,tsql,copy,Sql,Sql Server,Tsql,Copy,我试图复制不同表中的数据,同时保持它们之间的不同链接 我的表格的简化结构: 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_f

我试图复制不同表中的数据,同时保持它们之间的不同链接

我的表格的简化结构:

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))
我的目标是能够复制一个时间表条目及其在时间表组和时间表类中的所有相关条目

在获得带有
插入
@@IDENTITY
@new\u timeline\u fk
后,我遇到了问题:

如何从
timeline\u组
复制并取回插入的PK,以便在复制
timeline\u类
时能够使用它们

我试着用这个:

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

告诉我们输出子句应该按我所希望的方式工作,但TSQL不接受它


你知道如何解决这个问题吗?

你应该使用Merge语句和Output子句,而不是直接插入,
请参阅“输出”中不存在g.pk,因为“插入”和select查询不会自动加入

您可以跳过@timeline\u group\u link\u pks表和输出内容,您不需要它

这应该起作用:

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

我把我得到的错误放在代码的注释中。多部分标识符“g.pk”无法绑定,因为您将使用旧组而不是复制的组。啊,是的。没有正确地考虑:PI并不真正喜欢合并,即使它看起来是一个可行的解决方案