Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server-一次更新一条记录的表_Sql_Sql Server_Cursor - Fatal编程技术网

SQL server-一次更新一条记录的表

SQL server-一次更新一条记录的表,sql,sql-server,cursor,Sql,Sql Server,Cursor,好的,请记住我对SQL Server是相当陌生的,虽然我已经构建并使用Access数据库,但我总是使用DAO与它们交互,因为创建循环很容易 以下是我正在尝试做的事情,但迄今为止没有成功: 1)我需要使用历史/转换表中的数据更新主动态表。[SendToTbl]表用作数据库中其余数据表的主键。历史记录/转换表-[SelectFromTbl]具有[SendToTbl]表中所有项目的历史记录。这基本上是一种多对一的关系 2)每行[SelectFromTbl]都是带有日期时间戳的更新,所以。。。[Send

好的,请记住我对SQL Server是相当陌生的,虽然我已经构建并使用Access数据库,但我总是使用DAO与它们交互,因为创建循环很容易

以下是我正在尝试做的事情,但迄今为止没有成功:

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

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

我认为我可能能够使用游标(是的,我读过很多帖子,其中一些人认为它是邪恶的)——但由于它是一个一次性脚本,不会以持续的方式使用,我认为使用游标的缺点得到了缓解

当我运行脚本时,我的结果窗口显示光标正在成功地通过[SelectFromTbl]移动。耶

它只是没有像预期的那样更新[SendToTbl]记录。Grrr

我一直在拼命地想让它发挥作用,也许这就是我正在寻找的方式,但我没有找到答案。[SelectFromTbl]中有超过300000条记录需要一次加载一条-按日期的特定顺序

我该如何用这些数据更新另一个表呢?我真的需要一些帮助来解决这个问题

这是我的公开版本

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

这是你的第二次取回下一个需要修复,见下文。你去拿了,但忘了把那部分拿进去

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

这是你的第二次取回下一个需要修复,见下文。你去拿了,但忘了把那部分拿进去

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

我不会使用游标。简单地说,我可以使用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

我不会使用游标。简单地说,我可以使用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

在你的第二次取回下一个(循环内),你需要
进入…
?在你的第二次取回下一个(循环内),你需要
进入…
?格雷格,你摇滚!就是这样-它的工作方式很有魅力。我想问题是你真的需要一个光标来更新你的东西吗?两个错误并不意味着它是对的。没错,但看看这个问题,你不需要一句粗话,我不同意塔胡夫女士。我尝试了许多不同的方法来移动记录,但没有一种有效。这个使用光标的解决方案是我能找到的解决问题的最佳解决方案,当我运行脚本时,它花了2.23分钟移动了超过100k条记录——按照我需要的顺序一次移动一条记录。这是在一个“测试”SQL envioron中,所以我印象深刻。就像我说的:它不是用于我的生产解决方案,只是用于一次性的情况。格雷格,你太棒了!就是这样-它的工作方式很有魅力。我想问题是你真的需要一个光标来更新你的东西吗?两个错误并不意味着它是对的。没错,但看看这个问题,你不需要一句粗话,我不同意塔胡夫女士。我尝试了许多不同的方法来移动记录,但没有一种有效。这个使用光标的解决方案是我能找到的解决问题的最佳解决方案,当我运行脚本时,它花了2.23分钟移动了超过100k条记录——按照我需要的顺序一次移动一条记录。这是在一个“测试”SQL envioron中,所以我印象深刻。正如我所说:它不是用于我的生产解决方案,只是用于一次性情况。