簡體   English   中英

SQL Server-一次更新表一個記錄

[英]SQL server - updating table one record at a time

好的,請記住,盡管我已經建立和使用Access數據庫,但我對SQL Server還是相當陌生,但是我總是使用DAO與它們進行交互,而創建循環很容易。

這是我正在嘗試做的事情,到目前為止還沒有成功:

1)我需要使用歷史記錄/轉換表中的數據更新主動態表。 [SendToTbl]表用作數據庫中其余數據表的主鍵。 歷史記錄/轉換表-[SelectFromTbl]具有[SendToTbl]表中所有項目的歷史記錄。 基本上,這是一對多的關系。

2) [SelectFromTbl]的每一行都是帶有日期時間戳記的更新,因此... [SendToTbl] id#1在[SelectFromTbl]中可能有6條記錄,需要一次移動一次。

我以為我可以做這個游標-( 是的,我讀過很多帖子,其中有些人認為它是邪惡的 )-但由於它是一次性腳本,因此不會以持續的方式使用。減輕了使用游標的弊端。

當我運行腳本時,結果窗口顯示光標成功在[SelectFromTbl]中移動。 好極了!

它只是沒有按預期更新 [SendToTbl]記錄。 rr!

我一直在想辦法解決這個問題,這是我一直在尋找的方法,但是我沒有找到答案。 [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

我不會使用游標。 簡單地說,我只能使用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

需要修復的是您的第二個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM