代码之家  ›  专栏  ›  技术社区  ›  NealWalters

SQL Begin Try/Catch(在探查器中)能对我撒谎吗?

  •  8
  • NealWalters  · 技术社区  · 8 年前

    我正在从BizTalk server调用存储过程并尝试对其进行调试。

    (1) Use SQL Debugger when stored proc called by an external process (2) Getting sp_tracegenerateevent to work in a stored procedure

    我一直在使用SQL事件探查器作为唯一了解情况的工具。但现在,我怀疑我的尝试/捕捉是否正确。在SSMS中运行时,代码工作正常,但在BizTalk中运行时,有时似乎总是在尝试/捕获。

    ALTER PROCEDURE WhatItsName 
        @CatchErrors varchar(max) OUTPUT 
    AS
    BEGIN
        SET NOCOUNT ON;
        SET XACT_ABORT OFF; 
    
    DECLARE @debugMessage varchar(max) = '' 
    DECLARE @RowCreateBy VARCHAR (100) 
    
    
    SET @RowCreateBy = '108004'
    BEGIN TRY 
        SET @RowCreateBy = '108005'
    END TRY 
    BEGIN CATCH 
        SET @debugMessage = 'set @RowCreatedBy Failed - how can this be ??? ' 
    END CATCH 
    etc... 
    

    探查器中的结果: enter image description here

    根据我们在上面的分析器中看到的情况,我的try/catch是否按预期工作?

    现在,当我从SSMS运行相同的存储过程时,会出现“正常”之类的情况。

    enter image description here

    BizTalk在DTC事务下运行所有操作。请注意,“BEGIN TRY”和“END TRY”语句显示在SSMS下的第二个配置文件中(并且“BEGIN CATCH”没有按预期触发),它们没有显示在上面的第一个配置文件中(存储过程是从BizTalk执行的)。

    然后,我在SSMS中的测试脚本中添加了“开始分布式事务”,结果与上面的其他SSMS测试相同。

    注意:我注意到这个模式有一个更复杂的问题,我想简化它以便在这里发布。

    1 回复  |  直到 8 年前
        1
  •  10
  •   Remus Rusanu    8 年前

    只是猜测,但客户端(本例中为Biztalk)可能正在使用 SET FMTONLY ON 提取结果集的形状(如果有)。打开此设置时, “执行”所有分支,包括CATCH块 。您看到的结果正是SQL Profiler中的结果。

    推荐文章