SQL - 在具有更新的标识种子的另一个插入内插入查询

时间:2010-10-08 03:21:34

标签: sql sql-server sql-server-2005 tsql

我有两张桌子T1和T2

T1有10个唯一记录,主键(Identity Seed)
对于T1中的每个记录,T2有多个具有外键的entires

T1有2列:PrimaryKey - DATA
T2有2列:PrimaryKey - FoeignKey(此FK是T1的主键)

我需要编写一个查询,它将从T1中选择所有记录并将新条目INSERT插入自身,即T1,具有相同的数据,并且由于T1上的PK是身份种子,因此这将自动生成新ID,生成这个新ID我需要使用这个新标识加入T2并插入新的相关记录。

我知道这会复制数据并且不是问题,这是一次性事务,因此查询不需要高效,但是没有游标,如果可以使用SELECT和INSERTS实现这一点最好使用外部变量进行循环!
谢谢!!

更新:如果T1中的条目并不总是建议在表T2中必须有相应的条目/条目。

P.S。我正在使用SQL Server 2005

2 个答案:

答案 0 :(得分:2)

假设T2上的主键也是IDENTITY,请使用:

-- Populate T1
INSERT INTO T1
SELECT data
  FROM T1

-- Populate T2 with T1 values
INSERT INTO T2
SELECT primary_key
  FROM T1 x
 WHERE EXISTS(SELECT NULL
                FROM T2 y
                JOIN T1 z ON z.primary_key = y.foreign_key
               WHERE z.data = x.data
                 AND z.primary_key != x.primary_key)

答案 1 :(得分:1)

如果表中没有任何当前活动,则以下内容将完全复制数据。它不一定是动态sql - 这只是为了自动化起始身份种子。

如果表格中有其他数据,您可以轻松使用此数据复制该数据或加入该数据。

declare @maxID int

select @maxID = max(pk)
from T1

declare @sql nvarchar(max)
set @sql = 
'create table #T1
(
 new_pk int not null identity(' + cast(@maxID as varchar) + ',1)
 ,old_pk int
 ,data nvarchar(max)
)

insert into #T1 (old_pk, data)
select pk, data
from T1

insert into T1 (data)
select data
from #T1

insert into T2 (fk)
select new_pk
from #T1
inner join T2 on T2.fk = #T1.old_pk

drop table #T1
'

exec sp_executesql @sql