我在sql server中有一个疑问 基本上,我需要在具有6000万行的表上运行它,一次更新每一行都会崩溃,因此我想对查询进行批处理,以便如果崩溃,它可以重新运行查询,并且跳过完成的批处理,继续处理剩下的那些。
我想用empref表的引用来更新emp表数据。这里的两个表都有记录数,但是我在下面提供了一些示例数据。
在更新时,我们需要使用top子句拆分批次,并且不应重复现有的top。
带有数据的样本表:
CREATE TABLE [dbo].[emp](
[id] [int] NULL,
[name] [varchar](50) NULL,
[sal] [int] NULL
)
CREATE TABLE [dbo].[empref](
[id] [int] NULL,
[name] [varchar](50) NULL,
[sal] [int] NULL
)
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (1, N'a', 100)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (2, N'b', 200)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (4, N'u', 300)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (7, N'x', 400)
GO
INSERT [dbo].[emp] ([id], [name], [sal]) VALUES (8, N't', 500)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (1, N'xx', 100)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (2, N'bb', 200)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (4, N'uu', 300)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (7, N'xxx', 400)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (8, N'tt', 500)
GO
INSERT [dbo].[empref] ([id], [name], [sal]) VALUES (10, N'ub', 600)
GO
基于上述数据,我希望输出如下:
emp:
id |name|sal
1 |xx |100
2 |bb |200
4 |uu |300
7 |xxx|400
8 |tt |500
我尝试如下:
declare @i int
set @i=1
while ( @i <= (select max(id) from emp ))
begin
update TOP(2) t set t.name=s.name
from emp t join empref s on t.id=s.id
print @@rowcount
set @i=@i+1
end
上面的更新查询仅更新仅前2个记录,并且不迭代下一个前2个记录update查询。 它总是只更新前2条记录。
请告诉我如何使用sql server中的while循环创建多个批处理。
答案 0 :(得分:0)
不能说这将是最快的方法,但是WHILE LOOP
选择相同的两行的原因是,您还需要跟踪{{1}上的Id
列}表
假设Emp
列是Id
列且没有空格
Identity