SQL server-一次更新一条记录的表
好的,请记住我对SQL Server是相当陌生的,虽然我已经构建并使用Access数据库,但我总是使用DAO与它们交互,因为创建循环很容易 以下是我正在尝试做的事情,但迄今为止没有成功: 1)我需要使用历史/转换表中的数据更新主动态表。[SendToTbl]表用作数据库中其余数据表的主键。历史记录/转换表-[SelectFromTbl]具有[SendToTbl]表中所有项目的历史记录。这基本上是一种多对一的关系 2)每行[SelectFromTbl]都是带有日期时间戳的更新,所以。。。[SendToTbl]id#1在[SelectFromTbl]中可能有6条记录需要一次移动一条 我认为我可能能够使用游标(是的,我读过很多帖子,其中一些人认为它是邪恶的)——但由于它是一个一次性脚本,不会以持续的方式使用,我认为使用游标的缺点得到了缓解 当我运行脚本时,我的结果窗口显示光标正在成功地通过[SelectFromTbl]移动。耶 它只是没有像预期的那样更新[SendToTbl]记录。Grrr 我一直在拼命地想让它发挥作用,也许这就是我正在寻找的方式,但我没有找到答案。[SelectFromTbl]中有超过300000条记录需要一次加载一条-按日期的特定顺序 我该如何用这些数据更新另一个表呢?我真的需要一些帮助来解决这个问题 这是我的公开版本SQL server-一次更新一条记录的表,sql,sql-server,cursor,Sql,Sql Server,Cursor,好的,请记住我对SQL Server是相当陌生的,虽然我已经构建并使用Access数据库,但我总是使用DAO与它们交互,因为创建循环很容易 以下是我正在尝试做的事情,但迄今为止没有成功: 1)我需要使用历史/转换表中的数据更新主动态表。[SendToTbl]表用作数据库中其余数据表的主键。历史记录/转换表-[SelectFromTbl]具有[SendToTbl]表中所有项目的历史记录。这基本上是一种多对一的关系 2)每行[SelectFromTbl]都是带有日期时间戳的更新,所以。。。[Send
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中,所以我印象深刻。正如我所说:它不是用于我的生产解决方案,只是用于一次性情况。