我正在使用 SQL Server 并嘗試將存盤程序中的錯誤回傳給呼叫者。但是,它似乎不起作用。除錯時回傳值為空。
錯誤處理:
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
uj5u.com熱心網友回復:
重復我在評論中所說的話,首先你的RETURNin theCATCH沒有意義。您沒有RETURN錯誤,RETURN回傳一個int值,并且(歷史上)用于表示程序的成功(0表示成功,其他任何表示失敗)。然而,它們的使用更具歷史意義,尤其是現在使用THROW和OUTPUT引數之類的東西。
說到THROW,您真的應該也使用它。作為關于狀態的檔案RAISERROR:
筆記
該
RAISERROR宣告不兌現SET XACT_ABORT。新應用程式應使用THROW而不是RAISERROR.
最后,你的錯誤和你的IF沖突。您IF檢查首席執行官是否不存在,但是,您提出的錯誤表明他們確實存在。
因此,我懷疑,您可能想要這樣的東西,它不需要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;
uj5u.com熱心網友回復:
您的問題是您永遠不會在此代碼中遇到錯誤。
您的代碼邏輯表示如果 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517358.html
上一篇:在SQLServerExpress中洗掉部分重復的行
下一篇:SQL按月份ID創建列標題
