【问题标题】:problem with raiseerror()raiseerror() 的问题
【发布时间】:2011-09-13 07:17:14
【问题描述】:

我要做的是创建一个执行插入语句的存储过程。由于表 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

【问题讨论】:

  • 不清楚你想做什么:它总是会在这段代码中遇到 RAISERROR。也没有匹配 RAISERROR 的检查

标签: sql sql-server raiseerror


【解决方案1】:

在这种情况下:

  • 标题应该是对另一个表和外键的查找
  • 如果需要,您可以在 CATCH 块中单独捕获 FK 约束违规...
  • ...但是您只允许客户端中新表中的行,所以我个人不会
  • 不需要 sys.messages 条目

您的代码也总是会遇到 RAISERROR,这不会增加任何价值,

【讨论】:

    【解决方案2】:
    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) Crew ID,你要插入,要么已删除,要么在数据库中不存在。

    (b) DepartmentID,你要插入,要么已删除,要么在数据库中不存在。

    这样出错的概率也就结束了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2017-04-03
      • 2013-11-16
      • 2013-02-25
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多