我正在使用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
表示成功,其他任何表示失败(。然而,它们的使用更具历史意义,尤其是现在有了THROW
和OUTPUT
参数。
说到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