SQL Server - 变量停止在循环

时间:2018-02-06 14:57:22

标签: sql-server loops sql-server-2012 cursor

编辑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匹配。

伙计,我希望我能把事情搞清楚,而不是相反。

1 个答案:

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