Raiserror未返回预期值



我正在使用SQL Server,并试图将存储过程中的错误返回给调用方。然而,它似乎不起作用。调试时,返回的值为null。

错误处理:

begin try
if not exists (select * from dbo.Employees where IsCEO = 1)
begin
insert into dbo.Employees (FirstName, LastName, Salary, IsCEO, IsManager, ManagerId, EmployeeRank)
values (@FirstName, @LastName, @Salary, @IsCEO, @IsManager, @ManagerId, @EmployeeRank)              
end
end try
begin catch
return raiserror ('CEO already exists', 15, 1)
end catch

要重复我在注释中所说的内容,首先,CATCH中的RETURN没有意义。您不会RETURN错误,RETURN会返回一个int值,并且(历史上(用于表示过程的成功(0表示成功,其他任何表示失败(。然而,它们的使用更具历史意义,尤其是现在有了THROWOUTPUT参数。

说到THROW,您真的应该也使用它。正如RAISERROR上的文件所述:

注意

RAISERROR语句不支持SET XACT_ABORT。新的应用程序应该使用THROW而不是RAISERROR

最后,您的错误和IF冲突。您的IF检查CEO是否不存在,但是,您提出的错误表明他们存在。

因此,我怀疑您可能想要这样的东西,它不需要TRY...CATCH,只需要IF...ELSE:

BEGIN
IF NOT EXISTS (SELECT * FROM dbo.Employees WHERE IsCEO = 1)
INSERT INTO dbo.Employees (FirstName,
LastName,
Salary,
IsCEO,
IsManager,
ManagerId,
EmployeeRank)
VALUES (@FirstName, @LastName, @Salary, @IsCEO, @IsManager, @ManagerId, @EmployeeRank);
ELSE
THROW 50001, N'CEO does not exist', 16; --Use an error number (and state) appropriate for your environment
--This will only be reached if the ELSE was not entered
RETURN 0;
END;

这里的问题是您在这段代码中从未遇到错误。

代码的逻辑表示,如果CEO不存在,请在表中插入员工。如果它存在,什么也不做。然后你检查一下这里面的错误,然后说CEO已经存在了,这毫无意义。

在我看来,你想做以下事情。

begin try
if not exists (select * from dbo.Employees where IsCEO = 1)
begin
insert into dbo.Employees (FirstName, LastName, Salary, IsCEO, IsManager, ManagerId, 
EmployeeRank)
values (@FirstName, @LastName, @Salary, @IsCEO, @IsManager, @ManagerId, 
@EmployeeRank)              
end
ELSE
BEGIN
raiserror ('CEO already exists', 15, 1)
END
end try
begin catch
--some code that handles possible errors in code above
end catch

相关内容

  • 没有找到相关文章

最新更新