我试图在我的存储过程中的每个循环中逐个删除表变量中的行,但有时它会保持循环并且无法删除记录。即使我试图打印该值,也会有记录。执行删除语句时,我没有收到任何错误。
是否存在从表变量中删除导致循环未结束的实例?
这是我的代码:
--DECLARATIONS
declare @temp_table table
(
rid int identity(1,1),
Account_Code varchar(255),
PRIMARY KEY (rid)
)
declare @row_count int = 0
declare @current_id int
-----------------------------
delete from @temp_table
insert into @temp_table
select distinct a.Account_Code from MyTable a
set @row_count =(select COUNT(*) from @temp_table)
print 'TABLE ROWS COUNT:'+ cast(@row_count as varchar(100))
while(@row_count <> 0)
begin
set @current_id = (select top 1 rid from @temp_table)
print 'Current ID in Process:'+cast(@current_id as varchar(100))
/*
Some Processes Here.....
*/
delete from @temp_table where rid = @current_id
set @row_count =(select COUNT(*) from @temp_table)
print 'TABLE ROWS COUNT:'+ cast(@row_count as varchar(max))
end
这是我从印刷价值观中获得的:
TABLE ROWS COUNT:21
Current ID in Process: 10403
TABLE ROWS COUNT:20
Current ID in Process: 10404
TABLE ROWS COUNT:19
Current ID in Process: 10405
TABLE ROWS COUNT:18
Current ID in Process: 10406
Current ID in Process: 10406
Current ID in Process: 10406
Current ID in Process: 10406
Current ID in Process: 10406
然后脚本在10406循环。
注意:我已经在脚本的这一部分之前使用@temp_table进行其他处理,这就是为什么rid值现在是10400及以上
答案 0 :(得分:1)
我不能在评论中说明这一点,但我相信你已经掩盖了一些重要的内容。
while(@row_count <> 0)
begin
set @current_id = (select top 1 rid from @temp_table)
print 'Current ID in Process:'+cast(@current_id as varchar(100))
/*
Some Processes Here.....
*/
if ... condition ...
begin
delete from @temp_table where rid = @current_id
set @row_count =(select COUNT(*) from @temp_table)
print 'TABLE ROWS COUNT:'+ cast(@row_count as varchar(max))
end
end -- while loop
必须有类似上面的内容,否则没有goto,它不能跳过print 'TABLE...
。条件是条件为FALSE导致循环不“前进”。
答案 1 :(得分:0)
我的坏。我已经找到了导致无限循环的原因。 在从表变量
中删除@current_id之前,我有这段代码BEGIN TRY
/*
calculations...
*/
END TRY
BEGIN CATCH
continue;
print 'ERROR'
END CATCH;
我的CATCH块中的continue跳过了删除语句。