Хранимая процедура не отображает сообщение об ошибке - PullRequest
0 голосов
/ 12 ноября 2019

Я пытаюсь написать хранимую процедуру, которая принимает имя, фамилию и номер телефона оператора, но выдаст сообщение об ошибке, если имя уже есть в таблице операторов.

По какой-то причине сообщение об ошибке не появляется, когда я добавляю имя, которое уже там. Не уверен, как это исправить

CREATE PROCEDURE AddCarrier
    (@firstname VARCHAR(30),
     @lastname VARCHAR(30), 
     @Phone CHAR(10))
AS
    IF EXISTS (SELECT firstname, lastname, phone FROM carrier)
    BEGIN
        RAISERROR('There already is a firstname and lastname of that value', 16, 1)
    END
    ELSE
    BEGIN
        INSERT INTO Carrier (FirstName, LastName, Phone)
        VALUES (@firstname, @lastname, @Phone)
   END
GO

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Вам нужно предложение WHERE:

Create Procedure AddCarrier (
    @firstname varchar(30),
    @lastname varchar(30),
    @Phone char(10)
) as
BEGIN    
    IF EXISTS (Select firstname,lastname, phone
               from carrier c
               where c.firstname = @firstname and
                     c.lastname = @lastname and
                     c.phone = @phone)
       BEGIN
      RaisError('There is already a firstname and lastname of that value',16,1)
       END;
    ELSE
    Begin
       insert into Carrier (FirstName,LastName, Phone)
           values (@firstname, @lastname, @Phone)
    END;
END;

Однако это неправильный подход. Вместо этого создайте уникальный индекс и поймайте исключение:

create unique index unq_carrier_3 on carrier(firstname, lastname, phone);

Тогда тело должно использовать блок try / catch:

Create Procedure AddCarrier (
    @firstname varchar(30),
    @lastname varchar(30),
    @Phone char(10)
) as
BEGIN    
    BEGIN TRY
       insert into Carrier (FirstName,LastName, Phone)
           values (@firstname, @lastname, @Phone);
    END TRY
    BEGIN CATCH  -- you can check for the particular error here
        RaisError('There is already a firstname and lastname of that value',16,1)
    END CATCH;
END;

Причина в том, что это лучше, потому чтобаза данных проверяет целостность данных - поэтому вы знаете, что данные верны. В вашей версии условия гонки могут фактически привести к вставке двух строк с одинаковыми значениями.

0 голосов
/ 12 ноября 2019

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
	-- Add the parameters for the stored procedure here
	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...