結論
使用できる
検証(準備)
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