我正在尝试在存储过程中设置输出参数,但我认为当我回滚事务时,我认为我也在将分配回滚到@out
. 那是对的吗?
如果是这样,我如何返回消息并回滚事务?我正在@out
从 C# 获取参数。
create PROCEDURE [dbo].[sp]
@out varchar(2000) output
AS
BEGIN
SET NOCOUNT ON
BEGIN TRANSACTION
BEGIN TRY
SET @OUT = "success";
COMMIT TRANSACTION
END TRY
BEGIN CATCH
set @out = 'not success';
ROLLBACK TRANSACTION
END CATCH
END
我最初是在做一个
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
...但这并没有帮助,尽管我更喜欢这种方法。
编写此存储过程的更可靠的方法是:
注意
XACT_ABORT
在BEGIN TRY
. 由于以下参考文献中涵盖的原因,RAISERROR
通常更喜欢也,但重要的是:THROW
中止批处理会导致未分配任何输出参数。
SQL Server 中的错误处理极其古怪,因此我鼓励您查看 Erland Sommarskog 所撰写的关于该主题的开创性工作:SQL Server 中的错误和事务处理。
由于您使用的是 SQL Server 2016,因此我建议您使用
THROW
这将采用导致
TRY
构造转移到CATCH
构造的错误,并再次抛出相同的错误。如果你想在这里,你也可以将错误记录到一个表中,做任何
ROLLBACK
不会做的清理练习,等等。需要明确的是,对于调用应用程序,这将是一个异常而不是结果集。
注意: 之前的语句
THROW
必须以分号结束,否则可能会被解释为ROLLBACK TRANSACTION THROW
事务THROW
或保存点名称。