1

我有一些 SQL:

BEGIN TRY
    DECLARE @RowsInserted int;
    SET @RowsInserted = @@ROWCOUNT;
    SELECT @RowsInserted+'test' as [SUCCESS];
END TRY

BEGIN CATCH    
    SELECT ERROR_MESSAGE() AS [ERROR]    
END CATCH

令我惊讶的是,这实际上产生了两个批次(数据集):

在此处输入图像描述

GO由于工作方式,我不能用来拆分批次TRY...CATCH。那么这是否意味着如果发现一些错误,总会有一些虚拟结果集?

我真正想做的是扔掉 SUCCESS 批次(或其他类似的假批次)。否则,我必须浏览一些垃圾批次才能在 catch 语句中找到错误报告批次,这似乎令人困惑。

4

2 回答 2

2

您需要在 catch 块中做的是引发错误而不是选择它。

BEGIN CATCH
    -- rethrow error
    DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE()
    DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
    DECLARE @ErrorState INT = ERROR_STATE()

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH

那里有一个分离:结果集 ( select) 用于处理数据,而错误 ( raiserror) 用于传达故障。

于 2013-02-08T14:41:57.497 回答
0

我不认为这是可能的——在枚举开始之前和可能知道任何记录评估都会产生错误之前,对结果集的引用会返回给客户端。

于 2013-02-08T14:31:52.803 回答