好的,请记住我对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
答案 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