0

テーブルからデータを取得して一時テーブルに挿入するプロシージャがあります。次に、プロシージャは while ループで 1 つずつ検証します。

例: 50 行あり、最初の行が失敗します。その場合、手順が残りの 49 行の処理を続行することを望みます。

私はinsert文で強制的にエラーを出し、その下に入れました@@error <> 0が、ifブロックに入りません。

しかし、プロシージャは終了し、実行される次のステートメントには続きません。

私はQuery Analyzerから手順を実行しており、print 'line 1'などでメッセージを入れています。

ご協力ありがとうございました。

これは似たような例です

create procedure procx
as

  declare
    @ind_max  int,
    @ind      int,
    @var_id   int,
    @var_name varchar(3)

  declare @table_x table
  (
    row_id    int identity(1,1),
    id_x      int,
    name_x    varchar(25),
    status_x  int
  )

  insert into @table_x values(1, 'xxx', 0)
  insert into @table_x values(2, 'yyy', 0)
  insert into @table_x values(3, 'zzz', 0)

  set @ind_max = 3
  set @ind = 1

  while (@ind <= @ind_max)
  begin

    print 'line 1'

    select @var_id   = id_x   ,
           @var_name = name_x
    from @table_x
    where row_id = @ind

    -- Forced error id_x is int field
    -- Doesn't show line2, line3 ...
    -- Msg 245, Level 16, State 1, Procedure procx, Line 160
    -- Syntax error converting the varchar value 'A' to a column of data type int.
    insert into test ( id_x , name_x )
    values ( 'A' , @var_name )

    if @@error != 0
    begin

      print 'line 2'
      goto next_row

      insert into log_test values(@var_id, 'Error')

    end

    print 'line 3'

    update @table_x
    set status_x = 1
    where row_id = @ind

    print 'line 4'

next_row:
    set @ind = @ind + 1

  end

  print 'line 5'
4

1 に答える 1