【问题标题】:Can SQL Begin Try/Catch be lying to me (in the profiler)?SQL Begin Try/Catch 可以对我撒谎吗(在分析器中)?
【发布时间】:2018-09-30 11:57:27
【问题描述】:

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

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

我一直使用 SQL Profiler 作为我了解正在发生的事情的唯一工具。但是现在,我怀疑我的尝试/捕获是否正常工作。代码在 SSMS 中运行时运行良好,但从 BizTalk 运行时,有时似乎 try/catch 一直在捕获。

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... 

Profiler 中的结果:

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

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

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

然后我在 SSMS 中的测试脚本中添加了“BEGIN DISTRIBUTED TRANSACTION”,结果与上面的其他 SSMS 测试相同。

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

【问题讨论】:

    标签: sql-server sql-server-profiler


    【解决方案1】:

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

    【讨论】:

    • 当 BizTalk 构建架构时,是的,情况就是如此。但我不认为它不能在运行时做到这一点,因为那样 SQL 业务逻辑将无法工作。
    • 检查 - 也许它会调用它两次,一次是 FmtOnly On,一次是 FmtOnly Off。我会重新测试并检查:geekswithblogs.net/SERivas/archive/2010/09/15/…
    • 我检查了分析器,是的,它正在运行 FmtOnly=On。 BizTalk 返回错误:System.InvalidCastException:指定的转换无效。我以为这是从运行时开始的,我试图调试我的代码,但可能错误来自基于第一个 FmtOnly=ON 调用的不匹配。我会去 BizTalk 论坛确认一下;然后在验证后返回并检查答案。
    • 谢谢。事实上,既然我已经解决了其他错误,我可以在分析器中看到 BizTalk 调用了两次存储过程,一次是使用 FmtOnly=On,第二次是使用 FmtOnly=Off 真正执行它
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多