[SQL Server]Cant raise error into catch block of .net when you use the output clause

透過EF呼叫SP,SP中的throw無法拋回前端,就像exception被吃掉了一樣

昨天和同事在看一個問題,依照慣例,我們在sp透過throw關鍵字都可以把控制權交還給client(因為throw的層級=16),

這時我們可以在C#的catch block來控制錯誤邏輯的處理,但如果你有用到OUTPUT子句的話,可能就需要繞路了。

--Sp
alter proc usp_updnumber(@c1 int,@c2 varchar(10))
as
set nocount on;
set xact_abort on;
begin tran
 update mynumbers set c2=@c2
 output inserted.c2
 where c1=@c1

if @@ROWCOUNT=0
 throw 51000,'Data not found',1;
commit

--單獨測試SP一切正常
exec usp_updnumber 6,'newrico'

現在透過C#,前端呼叫該SP如下

await ThrowTest(6, "newrico");

沒想到一切正常,居然沒有進入catch block,後來同事發現,EF在Query時

只要可以正常取得第一個結果集就不會出錯,知道這特性後,我目前是先透過table variable來解決這問題

alter proc usp_updnumber(@c1 int,@c2 varchar(10))
as
set nocount on;
set xact_abort on;
declare @tmp table(c2 varchar(10));
begin tran
 update mynumbers set c2=@c2
 output inserted.c2 into @tmp 
 where c1=@c1

if @@ROWCOUNT=0
 throw 51000,'Data not found',1;
commit 

select * from @tmp

當資料沒有異動,可以正常進入catch block,我們才可以後續處理錯誤邏輯

當資料有異動,當然也可以正常收到結果