2017-04-20 57 views
0

好的,请记住,虽然我已经构建并使用Access数据库,但对于SQL Server来说我还是比较新的,但我总是使用DAO与它们交互以创建一个循环很容易 - 佩奇。SQL服务器 - 一次更新表中的一条记录

这里就是我试图做的,没有成功至今:

1)我需要从历史/转换表的数据更新主动态表。 [SendToTbl]表用作数据库中其余数据表的主键。历史/转换表 - [SelectFromTbl]具有[SendToTbl]表中所有项目的历史记录。这基本上是多对一的关系。

2)的[SelectFromTbl]每行是日期时间戳更新一个,所以...... [SendToTbl] ID#1可能有6条在[SelectFromTbl]需要在一个要移动一个时间。

我以为我可以做这个光标 - (是的,我读过多篇文章,有些人认为它是邪恶的) - 但由于它是一次性脚本,不会用于我认为使用游标的弊端得到缓解。

当我运行我的剧本,我的结果窗口显示光标通过[SelectFromTbl]移动成功。好极了!

这是不更新的[SendToTbl]记录如预期。哎呀!

我一直在殴打我的头靠在墙上试图让这个工作,也许这是我正在寻找的方式,但我没有找到答案。 [SelectFromTbl]有超过30万条记录,需要一次加载一个 - 按日期按特定顺序....

这是怎么回事我用数据更新其他表?我真的可以在这里使用一些帮助来解决这个问题。

这里是我的公版

declare 
     @MainID int 
    , @myNumber int 
    , @myAmt decimal(25,2) 
    , @myName varchar(100) 

DECLARE tCusor CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
    FOR SELECT [Main]  
       , [myNumber] 
       , [myAmount] 
       , [myName] 
    FROM [dbo].[SelectFromTbl] 

    open tCusor 
    fetch next from tCusor 
     into @MainID, @myNumber, @myAmt, @myName 
    while (@@FETCH_STATUS = 0) 
    begin 

     UPDATE [dbo].[SendToTbl] 
      SET [MainNum] = @myNumber 
      , [MainAmt] = @myAmt 
      , [MainName] = @MyName 
     WHERE [MainID] = @MainID 
    fetch next from tCusor 
    end 
    close tCusor 
    deallocate tCusor 
GO 
+0

在你的第二次读取(循环内部)中,你需要'into @ ...'吗? – TZHX

回答

0

这是你的第二FETCH NEXT,需要加以固定,见下文。你做了抓取,但忘记了INTO部分。

declare 
    @MainID int 
, @myNumber int 
, @myAmt decimal(25,2) 
, @myName varchar(100) 

DECLARE tCusor CURSOR 
LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR SELECT [Main]  
      , [myNumber] 
      , [myAmount] 
      , [myName] 
FROM [dbo].[SelectFromTbl] 

open tCusor 
fetch next from tCusor 
    into @MainID, @myNumber, @myAmt, @myName 

while (@@FETCH_STATUS = 0) 
begin 
    UPDATE [dbo].[SendToTbl] 
     SET [MainNum] = @myNumber 
     , [MainAmt] = @myAmt 
     , [MainName] = @MyName 
    WHERE [MainID] = @MainID 

    fetch next from tCusor 
     into @MainID, @myNumber, @myAmt, @myName 
end 
close tCusor 
deallocate tCusor 
+0

格雷格,你摇滚!就是这样 - 它的工作就像魅力。 –

+0

我想这个问题是否真的需要光标来更新你的东西?两个错误并不正确。 – maSTAShuFu

+0

使用游标没有任何问题。 – Greg

2

我不会使用光标。我只需要使用UPDATE FROM JOIN语句

UPDATE tbto 
SET MainNum = tbfrom.myNumber, 
    MainAmnt = tbfrom.myAmount, 
    MainName = tbfrom.myName 
FROM SelectFromTbl tbfrom 
INNER JOIN SendToTbl tbto 
    ON tbfrom.Main = tbto.MainID 
相关问题