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
好的,请记住我是 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