【SQL Server】カーソルを用いた繰り返し処理の中で、エラー処理が使用できるかどうかの検証

結論

使用できる

検証(準備)

1.確認用のテーブルを2つを作成
・部署テーブル
・社員テーブル
 ※列「Department_ID」に外部参照制約を設定。参照先は部署テーブルの列「Id」

CREATE TABLE Department(
	[Id] NVARCHAR(30) NOT NULL PRIMARY KEY,
	[Name] NVARCHAR(30) NOT NULL
)

--社員テーブル
CREATE TABLE Employee(
	[Id] NVARCHAR(30) NOT NULL PRIMARY KEY,
	[Name] NVARCHAR(30) NOT NULL,
	[Department_ID] NVARCHAR(30),
	constraint FK_Department_ID foreign key([Department_ID]) references Department([Id])
)

--部署テーブル
INSERT INTO Department VALUES ('001','営業部')
--社員テーブル
INSERT INTO Employee VALUES ('20200405001','鈴木','001')
INSERT INTO Employee VALUES ('20200405002','加藤','001')
INSERT INTO Employee VALUES ('20200405003','中田','001')

SELECT * FROM Department
SELECT * FROM Employee

●実行結果

検証(カーソルを用いた繰り返し処理の中でエラー処理が使用)

BEGIN TRYの中で、外部参照制約エラーが発生するSQLを実行

DECLARE
	@count int,
	@Id NVARCHAR(30),
	@Name NVARCHAR(30),
	@Department_ID  NVARCHAR(30)

	SET @count = 0

--カーソル定義
DECLARE cursor1 CURSOR FOR SELECT * FROM Employee

--カーソルのオープン
OPEN cursor1

--初回のフェッチをする(1レコード分を取得)
FETCH NEXT FROM cursor1 INTO
	@Id,
	@Name,
	@Department_ID

--全てフェッチするまで繰り返し
WHILE @@FETCH_STATUS = 0 
	BEGIN
		
		SET @count = @count + 1

		BEGIN TRY
			--社員テーブル
			UPDATE Employee SET Department_ID = '999' WHERE Id = '20200405001' 
			SELECT 'エラー発生無し'
		END TRY

		BEGIN CATCH
			SELECT 'エラー発生 繰り返し回数:' + CONVERT(VARCHAR(100),@count)
			SELECT 'エラーコード:' + CONVERT(nvarchar(10),ERROR_NUMBER())
			SELECT 'エラーメッセージ' + ERROR_MESSAGE()
		END CATCH

		FETCH NEXT FROM cursor1 INTO
			@Id,
			@Name,
			@Department_ID
	END

--カーソルのクローズ
CLOSE cursor1
--カーソルの解除
DEALLOCATE cursor1

●実行結果


エラーメッセージ全文は以下。

エラーメッセージUPDATE ステートメントは FOREIGN KEY 制約 "FK_Department_ID" と競合しています。競合が発生したのは、データベース "testDB"、テーブル "dbo.Department", column 'Id' です。

後片付け

1.確認用のテーブルを2つを削除

--社員テーブル
DROP TABLE Employee

--部署テーブル
DROP TABLE Department
タイトルとURLをコピーしました