首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从table1复制条目,然后使用table1外键从table2复制条目

从table1复制条目,然后使用table1外键从table2复制条目
EN

Stack Overflow用户
提问于 2014-07-01 17:49:12
回答 2查看 69关注 0票数 0

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

my tables的简化结构:

代码语言:javascript
复制
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中的所有相关条目。

在获得带有INSERT@@IDENTITY@new_timetable_fk之后,我遇到了问题:

在复制timetable_class时,如何从timetable_group复制并取回插入的pks,以便能够使用它们?

我试着使用这个:

代码语言:javascript
复制
-- 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不接受它。

你知道怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2014-07-01 18:42:48

您应该将Merge语句与Output子句一起使用,而不是直接使用insert,请参阅Link

票数 2
EN

Stack Overflow用户

发布于 2014-07-01 20:17:10

g.pk不存在于"output“中,因为"inserted”和select查询不会自动联接。

您可以跳过@timetable_group_link_pks表和输出内容,您不需要它们。

这应该是可行的:

代码语言:javascript
复制
-- 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24507236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档