SQL服务器 - 一次更新表一条记录

时间:2017-04-20 21:29:42

标签: sql sql-server cursor

好的,请记住我对SQL Server相当新,虽然我已经构建并使用了Access数据库,但我总是使用DAO与它们进行交互,在这里创建循环很容易。

这是我想要做的,到目前为止没有成功:

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

2) [SelectFromTbl]的每一行都是带有日期时间戳的更新,因此...... [SendToTbl] id#1可能在[SelectFromTbl]中有6条记录需要一次移动一个。

我认为我可以做这个游标 - (是的,我已经读过一些人认为它是邪恶的帖子) - 但是因为它是一个一次性的脚本会不能以持续的方式使用我认为使用游标的缺点可以减轻。

当我运行脚本时,我的结果窗口显示光标 成功通过[SelectFromTbl]。 YAY!

根据预期, 正在更新 [SendToTbl]记录。哎呀!

我一直在靠墙试图让这个工作起来,也许这就是我正在寻找的方式,但我找不到答案。 [SelectFromTbl]中有超过300,000条记录需要一次加载一个 - 按日期按特定顺序....

如何用数据更新另一个表?我真的可以在这里使用一些帮助来解决这个问题。

这是我的公开版

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

2 个答案:

答案 0 :(得分:2)

我不会使用Cursor。我只需使用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

答案 1 :(得分: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