0

私がやりたいのは、insert ステートメントを実行するストアド プロシージャを作成することです。テーブル Employee のチェック制約のために実行が失敗する可能性があります。その場合、ユーザー定義エラーを処理したいです。明らかに次の挿入が失敗した場合だけでなく、常にエラーが発生するため、手順が正しく機能していません。

EXEC sp_addmessage 50001, 16, N'Title must be one of the following - Captain,Engineer,Flight-attendant,Purser,First-officer';

CREATE PROCEDURE InsertIntoEmployee

 @firstName nvarchar(30),
 @familyName nvarchar(30),
 @title nvarchar(50), 
 @address nvarchar(50), 
 @chiefID int , 
 @salary money ,
 @FK_IDCrew int,
 @FK_DepartmentID int 

AS
BEGIN 
declare @err_num int;
declare @err_sev int;
declare @err_msg int;

begin try
insert into Employee(firstName, familyName, title, address, chiefID, salary, FK_IDCrew,
FK_DepartmentID)
values(@firstName, @familyName, @title, @address, @chiefID, @salary, @FK_IDCrew,
@FK_DepartmentID);

raiserror(50001,16,1);
END try 
begin catch
set  @err_num=ERROR_NUMBER();
set @err_sev=ERROR_SEVERITY();
set @err_msg=ERROR_STATE();
raiserror(@err_num,@err_sev,@err_msg);
end catch 
end
GO
4

2 に答える 2

0

この場合:

  • タイトルは、別のテーブルと外部キーへのルックアップである必要があります
  • CATCH ブロックでは、必要に応じて FK 制約違反を個別にトラップできます...
  • ...しかし、クライアントの新しいテーブルからの行のみを許可するので、個人的にはしません
  • sys.messages エントリは不要

あなたのコードは、値を追加しない RAISERROR も常にヒットします。

于 2011-06-12T07:36:13.000 に答える
0
  1. パラメータリストに記載されている寸法がテーブルの列の長さと同期していることを願っています。

  2. 挿入する前に、次の点に注意してください。

    そのテーブルに@FK_IDCrew値が存在することを確認します。

    そのテーブルに@FK_DepartmentID値が存在することを確認します。

以下のようになるはずです。

If Not Exists(Select IDCrewColumnName From Table Where columnName = @FK_IDCrew)
Begin
    return here from the stored procedure.
End

それらのいずれかが条件を満たさない場合は、ユーザーにわかりやすいメッセージを表示する必要があります。

(a)挿入しようとしているCrew IDは、削除されたか、データベースに存在しません。

(b)挿入しようとしているDepartmentIDは、削除されたか、データベースに存在しません。

このようにして、エラーの可能性もなくなります。

于 2011-06-12T08:58:49.797 に答える