sql - 批量更新不结束,剩余数据不更新
问题描述
我需要批量更新一个表,但它不起作用。我尝试了以下 2 个选项。
这两个选项都会更新前 10 行,但更新仍在运行。但只有 10 行保持更新。
似乎更新永远不会完成,并且计数显示的记录数超过要更新的表中的记录数。
请指教。
- 选项1
SET NOCOUNT OFF
IF OBJECT_ID('tempdb..#Table') IS NOT NULL
BEGIN
DROP TABLE #Table
END
-- select count(*) from #Table where ID = 0
-- select * from #Table
CREATE TABLE #Table ( ID INT )
WHILE (1 = 1)
AND ( Select count(*) from #Table ) < 10000
BEGIN
BEGIN TRANSACTION
INSERT INTO #Table (ID)
VALUES (1)
IF @@ROWCOUNT = 10000 -- terminating condition;
BEGIN
COMMIT TRANSACTION
BREAK
END
END
-- UPDATE
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION
UPDATE TOP (10) upd
SET ID = 0
FROM #Table upd
IF @@ROWCOUNT = 0 -- terminating condition;
BEGIN
COMMIT TRANSACTION
BREAK
END
END
-- 选项 #2
SET NOCOUNT OFF
IF OBJECT_ID('tempdb..#Table2') IS NOT NULL
BEGIN
DROP TABLE #Table2
END
-- select count(*) from #Table2 where ID = 0
-- select * from #Table2
CREATE TABLE #Table2 ( ID INT )
--DECLARE @rows INT
--DECLARE @count INT
WHILE (1 = 1)
AND ( Select count(*) from #Table2 ) < 10000
BEGIN
BEGIN TRANSACTION
INSERT INTO #Table2 (ID)
VALUES (1)
IF @@ROWCOUNT = 10000 -- terminating condition;
BEGIN
COMMIT TRANSACTION
BREAK
END
END
DECLARE @rows INT
DECLARE @count INT
-- UPDATE
SET @rows = 1
SET @count = 0
WHILE @rows > 0
BEGIN
BEGIN TRANSACTION
UPDATE TOP (10) #Table2 -- upd
SET ID = 0
-- FROM #Table upd
SET @rows = @@ROWCOUNT
SET @count = @count + @rows
RAISERROR('COUNT %d', 0, 1, @count) WITH NOWAIT
COMMIT TRANSACTION
END
解决方案
好的,您的代码存在一些问题。
- 您不能
TOP
在更新中使用 - 但是它相当直接地使用子查询来限制行,如图所示。 - 您将所有 ID 设置为,
1
因此无法唯一标识一行,您只能更新所有 ID。我假设在您的现实生活问题中,您将拥有唯一的 ID,并且我已经修改了代码以适应。 - 我不确定各种嵌套事务的意图,它们似乎完成的不多,也不符合逻辑。
IF OBJECT_ID('tempdb..#Table2') IS NOT NULL
BEGIN
DROP TABLE #Table2;
END
CREATE TABLE #Table2 (ID INT);
DECLARE @Count int = 0;
WHILE (select count(*) from #Table2) < 10000 BEGIN
INSERT INTO #Table2 (ID)
VALUES (@Count)
-- Make sure we have a unique id for the test, else we can't identify 10 records
set @Count = @Count + 1;
END
-- While exists an 'un-updated' record continue
WHILE exists (select 1 from #Table2 where ID > 0) BEGIN
-- Update any top 10 'un-updated' records
UPDATE #Table2 SET
ID = 0
where id in (select top 10 id from #Table2 where ID > 0)
END
DROP TABLE #Table2
推荐阅读
- reactjs - React Redux this.props.getClasses 不是函数
- sql - Oracle SQL 小时 HH:MM:SS 中的日期之间的差异
- tomcat - 在 Openshift v3 Tomcat 映像中编辑 catalina.sh
- bootstrap-4 - Bootstrap 4 - 下拉值填充
- java - 在没有对象映射器的情况下将对象转换为 Jackson 中的 JSON 文件
- sql - 未实现匿名复合类型的输入 - Postgres
- angular - 无法以 Angular 4 提交表单
- c# - 使用 C# 脚本创建 SSIS 包以使用 BULK API 从 Salesforce 加载数据
- visual-studio-code - 在我的新 MacBook Pro 中找不到匹配命令“dotnet-aspnet-codegeneration”的可执行文件
- ios - 如何在不快速下载的情况下在 chrome 或 safari 中打开 pdf 文件?