繁体   English   中英

存储过程不显示错误信息

[英]Stored procedure not displaying error message

我正在尝试编写一个接受运营商名字、姓氏和电话号码的存储过程,但如果名称已经在运营商表中,则会返回错误消息。

由于某种原因,当我添加一个已经存在的名称时,错误消息不会出现。 不知道如何解决这个问题

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

你需要一个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;

这更好的原因是因为数据库验证了数据的完整性——所以你知道数据是正确的。 在您的版本中,竞争条件实际上可能导致插入具有相同值的两行。

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM