从表变量MS SQL中删除

时间:2012-10-10 09:44:41

标签: sql loops table-variable

我试图在我的存储过程中的每个循环中逐个删除表变量中的行,但有时它会保持循环并且无法删除记录。即使我试图打印该值,也会有记录。执行删除语句时,我没有收到任何错误。

是否存在从表变量中删除导致循环未结束的实例?

这是我的代码:

    --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及以上

2 个答案:

答案 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跳过了删除语句。