编辑2:
我添加了此示例中使用的表结构,以尝试澄清问题。感谢@Sean的推荐和耐心。
Create Table TheHeaderTable(
id bigint Identity(1,1) not null,
varOne datetime,
varTwo nvarchar(30),
varThree nvarchar(30),
varFour nvarchar(6)
constraint PK_TheTable primary key (id)
)
Create Table TheDetailsTable(
FK_Bitacora_id bigint, --FK to TheTable.id
isPK bit,
nuevo varchar(10),
viejo varchar(10)
constraint FK_TheDetailsTable foreign key (FK_Bitacora_id) references TheTable(id)
)
我还从" TheTable"更改了表名。到#34; TheHeaderTable"澄清。
原帖
SQL Server 2012
嗨,我在尝试从另一个表(在另一个数据库中,同一个实例)中大量插入一个表时遇到问题。
我在同一台服务器上基本上有两个具有相同结构的数据库,我需要插入来自2个数据库表的信息(一个是"标题"另一个是详细信息)。 / p>
标题具有Identity自动递增ID,并且数据库已被使用,因此我无法简单地将所有数据从一个复制到另一个,ID必须刷新。我带来了以下代码(更改了表和变量名称)
declare @id bigInt --PK
declare @varOne datetime
declare @varTwo nvarchar(30)
declare @varThree nvarchar(30)
declare @varFour nvarchar(6)
declare @outTable table (id bigint)
declare @outId bigint
declare db_cursor CURSOR FOR
SELECT *
FROM AnotherDatabase.dbo.TheHeaderTable
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @id, @varOne,
@varTwo, @varThree, @varFour
WHILE @@FETCH_STATUS = 0
BEGIN
Insert into TheHeaderTable
(varOne, varTwo, varThree, varFour)
Output Inserted.id into @outTable
VALUES
(@varOne, @varTwo, @varThree, @varFour)
select @outId = id from @outTable
Insert into TheDetailsTable
(FK_Bitacora_id, nombre, isPK, nuevo, viejo)
select @outID, nombre, isPK, nuevo, viejo
from AnotherDatabase.dbo.TheDetailsTable
where FK_Bitacora_id = @id
FETCH NEXT FROM db_cursor INTO @id, @varOne,
@varTwo, @varThree, @varFour
END
CLOSE db_cursor
DEALLOCATE db_cursor
代码似乎首先工作,经过几千行&#34;详细信息表&#34;是空的。在调查了一下后,我决定查看第一个实例,这个问题出现了,然后我从ID中减去了1,我发现了一些非常奇怪的东西:所有细节(从那时起)都被插入到特定ID < / p>
我做了一个查询来计算脚本的插入次数(忽略从外部源新插入的所有内容)以及此问题之前的循环次数:115967
似乎@outTable或@outIs没有被正确更新。但老实说,我不知道为什么会这样。
我很感激我能得到的任何帮助。
谢谢!
编辑1:
只是为了澄清:
&#34; TheHeaderTable &#34;中的主键是&#34; id &#34;。 &#34;的 TheDetailsTable &#34;通过foreignKey链接到标题表&#34; FK_Bitacora_id &#34; (引用id)。
TheHeaderTable 中的ID是自动生成的,这就是我在插入时捕获其值的原因,但是要插入详细信息,我需要查找所有行(在 TheDetailsTable )与其原始ID匹配。
伙计,我希望我能把事情搞清楚,而不是相反。
答案 0 :(得分:2)
由于您需要捕获新插入的标识,因此您可以像使用OUTPUT一样使用OUTPUT。但是你不需要在这里循环。只需执行插入,然后加入到其他表中即可。您发布的所有代码都可以简化为基于此集的逻辑。给定行数我建议使用临时表而不是表变量,这样就可以添加聚集索引。
create table #outTable
(
id bigint primary key clustered
)
Insert into TheTable
(
varOne
, varTwo
, varThree
, varFour
)
Output Inserted.id into #outTable
select varOne
, varTwo
, varThree
, varFour
from AnotherDatabase.dbo.TheHeaderTable
Insert into TheDetailsTable
(
FK_Bitacora_id
, nombre
, isPK
, nuevo
, viejo
)
select ot.id
, nombre
, isPK
, nuevo
, viejo
from AnotherDatabase.dbo.TheDetailsTable d
join #outTable ot on ot.id = d.FK_Bitacora_id
drop table #outTable