テーブルからデータを取得して一時テーブルに挿入するプロシージャがあります。次に、プロシージャは 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'