概要
ストアドプロシージャの挙動を調べたので書く。
try catchがない場合とtry catchがある場合に、後続の処理がどうなるのかを書いた。
エラーになって次の処理をさせたくない場合は、@@ERROR で常にチェックするか。
try catchで処理の全体を囲むのが良い
サンプルプログラム
テーブル作成
table.sql
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[01_T](
[TITLE] [nvarchar](10) NULL
) ON [PRIMARY]
try catchがない場合は一行目がエラーとなり、2行目が実行されてしまう。
no-trycatch.sql
ALTER PROCEDURE [01_INSERTPROC] AS
-- 新規データ(処理は失敗する)←ここでエラーなっても
INSERT [01_T](TITLE) VALUES('1234567890A')
-- 新規データ(処理は成功する)←ここが実行される。
INSERT [01_T](TITLE) VALUES('12345')
RETURN @@ERROR
try catchがある場合、一行目がエラーなれば、処理が終了する。
trycatch.sql
ALTER PROCEDURE [01_INSERTPROC] AS
BEGIN TRY
--新規データ(処理は失敗する)←ここでエラーなると下の処理は実行されない。
INSERT [01_T](TITLE) VALUES('1234567890A')
-- 新規データ(処理は成功する)
INSERT [01_T](TITLE) VALUES('12345')
END TRY
BEGIN CATCH
--エラーを出力
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
RETURN 9999
END CATCH
RETURN ERROR_NUMBER()
ストアドの実行
ストアドの実行.sql
DECLARE @RC int
EXECUTE @RC = [dbo].[01_InsertProc]
select @RC
GO
参考サイト