Вам нужно предложение 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;
Причина в том, что это лучше, потому чтобаза данных проверяет целостность данных - поэтому вы знаете, что данные верны. В вашей версии условия гонки могут фактически привести к вставке двух строк с одинаковыми значениями.