проблема с RaiseRerror () - PullRequest
       36

проблема с RaiseRerror ()

0 голосов
/ 12 июня 2011

я хочу создать хранимую процедуру, которая выполняет оператор вставки. Существует вероятность сбоя выполнения из-за ограничения проверки для таблицы 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

Ответы [ 2 ]

0 голосов
/ 12 июня 2011
  1. Я надеюсь, что размеры, указанные в списке параметров, sycn с длиной столбцов таблицы.

  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) Идентификатор экипажа , который вы собираетесь вставить, либо удален, либо не существует в базе данных.

(b) DepartmentID , который вы собираетесь вставить, либо удален, либо не существует в базе данных.

Таким образом, вероятность ошибки также заканчивается.

0 голосов
/ 12 июня 2011

В этом случае:

  • Заголовок должен быть поиском в другой таблице и внешним ключом
  • В блоке CATCH вы можете отдельно захватить нарушение ограничения FK, если хотите...
  • ... но вы бы разрешали только строки из новой таблицы в вашем клиенте, поэтому я бы не стал лично
  • Нет необходимости в записи sys.messages

Ваш код также всегда будет попадать в RAISERROR, который не добавляет никакого значения,

...