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

SQL server - updating table one record at a time

好的,请记住我是 SQL Server 的新手,虽然我已经构建并使用了 Access 数据库,但我总是使用 DAO 与它们交互,其中创建循环很容易.

这是我正在尝试做的事情,到目前为止没有成功:

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

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

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

当我 运行 我的脚本时,我的结果 window 显示光标 移动通过[SelectFromTbl] 成功。耶!

只是没有按预期更新 [SendToTbl] 记录。哇!

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

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

这是我的 public 版本

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 个 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

我不会使用 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