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

Can SQL Begin Try/Catch be lying to me (in the profiler)?

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

1) 2)

我一直在使用 SQL Profiler 作为我了解正在发生的事情的唯一工具。但是现在,我怀疑我的 try/catches 是否正常工作。在 SSMS 中 运行ning 时,代码工作正常,但是当来自 BizTalk 的 运行ning 时,有时似乎 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 的相同存储过程时,诸如 "normal" 之类的东西。

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

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

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

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