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 中获得的结果。
我正在从 BizTalk 服务器调用存储过程并尝试对其进行调试。
1)
我一直在使用 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 中获得的结果。