2

ストアド プロシージャのループごとにテーブル変数から行を 1 つずつ削除しようとしていますが、ループし続けてレコードを削除できない場合があります。値を PRINT しようとしても、レコードはそこにあります。私の削除ステートメントが実行されたときに、エラーは発生しません。

ループが終了しない原因となっているテーブル変数の削除が遅れているインスタンスはありますか?

これが私のコードです:

    --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

これは、The Values を印刷して得たものです。

    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 以上になりました。

4

2 に答える 2

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

上記のようなものがなければなりませんprint 'TABLE...。ポイントは、条件が FALSE であるため、ループが「進められない」ことです。

于 2012-10-10T09:50:28.267 に答える
0

私の悪い。無限ループの原因はすでにわかっています。テーブル変数から@current_idを削除する前に、このコードがあります

BEGIN TRY
    /*
        calculations...
    */
END TRY
BEGIN CATCH
    continue;
    print 'ERROR'
END CATCH; 

CATCHブロックのcontinueは、deleteステートメントをスキップします。

于 2012-10-12T06:07:22.000 に答える