当前位置: 首页 > 知识库问答 >
问题:

SQL 开始尝试/捕获是否对我撒谎(在探查器中)?

姬魁
2023-03-14

我从BizTalk server调用存储过程并尝试调试它。

1) 当外部进程调用存储过程时使用SQL调试器2)使sp_tracegenerateevent在存储过程中工作

我一直在使用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... 

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

现在,当我从SSMS运行同一个存储过程时,结果像“正常”。

BizTalk在DTC事务下运行所有内容。请注意,“BEGIN TRY”和“END TRY”语句显示在SSMS下的第二个配置文件中(并且“BEGIN CATCH”没有触发-如预期的那样),并且它们不会显示在上面的第一个配置文件中(其中sproc是从BizTalk执行的)。

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

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

共有1个答案

隆礼骞
2023-03-14

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

 类似资料:
  • 问题内容: 是否可以在中使用Try-Catch ? 问题答案: 不,这是不可能的。 这仅来自Sql Server 2005 检查TRY … CATCH(Transact-SQL)并检查 其他版本

  • 问题内容: 我有一个需要类似以下内容的场景 在我的尝试,我会,数据,将其与基于处理其他数据集。 在随后。有可能阻止吗?下面是伪代码: 问题答案: 无需创建表,您只需声明一个表变量(查询结束时该变量将自动消失)。

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 试一试无用的东西只是看看此代码是否引发了特定的异常,这是一个好方法吗? 我想在引发异常时做点什么,否则就什么也不做。 有太多的先决条件要测试,构造函数BigDecimal()始终检查所有条件,因此这似乎是最简单的方法。 问题答案: 通常,应避免这种做法。但是,由于没有实用程序方法,所以这是要走的路。 正如Peter Tillemans在评论中指出的那样,将此代码放在称为的实用程序方法中

  • 问题内容: 下面的代码询问用户他/她想要多少个赛车手。 如果在代码中输入数字,则代码会跳出循环,并且程序的其余部分可以正常运行;但是,当我输入诸如“ awredsf”之类的内容时,它应该捕获该异常,并且确实如此。它没有连续提示用户,而是连续循环,这对我来说没有意义。 连续循环时,程序打印如下: 多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车