【SQL Server】T-SQLのtry catch について
ストアドプロシージャを書く際にエラー処理を書くかと思いますが、例外をスローするためのサンプルを掲載します。
Googleで検索するとやたらRAISERRORを使ったサンプルが検索にヒットしますが、SQLserver2012以降を使っている場合なら単純にTHROWすればよいかと。
サンプルとしてEMPLOYEESテーブルを更新するストアドを作成します。
/*********************************************/ -- try catchのサンプル /*********************************************/ USE sales GO DROP PROCEDURE IF EXISTS dbo.usp_throw_test; GO CREATE PROCEDURE dbo.usp_throw_test @Employee_id INT, @Salary INT AS BEGIN SET NOCOUNT ON; BEGIN TRY BEGIN TRAN; SELECT * FROM [dbo].[EMPLOYEES] WITH (UPDLOCK) WHERE EMPLOYEE_ID = @Employee_id UPDATE [dbo].[EMPLOYEES] SET SALARY = @Salary WHERE EMPLOYEE_ID = @Employee_id COMMIT TRAN; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN; THROW; END CATCH END GO
テーブルにはCHECK制約としてsalary>0という条件を制約とします。
ALTER TABLE [dbo].[EMPLOYEES] WITH NOCHECK ADD CONSTRAINT [EMP_SALARY_MIN] CHECK (([salary]>(0))) GO ALTER TABLE [dbo].[EMPLOYEES] CHECK CONSTRAINT [EMP_SALARY_MIN] GO
エラーを発生させると例外がスローされます。
EXEC dbo.usp_throw_test @Employee_id = 103, @Salary = -15000