8 votes

SQL Begin Try/Catch peut-il me mentir (dans le profiler) ?

J'appelle une procédure stockée à partir du serveur BizTalk et j'essaie de la déboguer.

1) Utiliser le débogueur SQL lorsque la procédure stockée est appelée par un processus externe 2) Faire fonctionner sp_tracegenerateevent dans une procédure stockée

J'ai utilisé SQL Profiler comme seul outil pour savoir ce qui se passe. Mais maintenant, je doute que mes try/catches fonctionnent correctement ou non. Le code fonctionne bien lorsqu'il est exécuté dans le SSMS, mais lorsqu'il est exécuté à partir de BizTalk, il semble parfois que les try/catch sont toujours en train d'attraper.

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

Résultats dans Profiler : enter image description here

Sur la base de ce que nous voyons dans le profiler ci-dessus, mon try/catch fonctionne-t-il comme prévu ou non ?

Maintenant, lorsque j'exécute le même processus stocké à partir de SSMS, les choses se déroulent normalement.

enter image description here

BizTalk exécute tout dans le cadre d'une transaction DTC. Remarquez que les instructions "BEGIN TRY" et "END TRY" apparaissent dans le deuxième profil sous SSMS (et que l'instruction "BEGIN CATCH" ne se déclenche PAS - comme prévu), alors qu'elles n'apparaissent pas dans le premier profil ci-dessus (où la sproc est exécutée à partir de BizTalk).

J'ai ensuite ajouté "BEGIN DISTRIBUTED TRANSACTION" à mon test script dans SSMS, et j'ai obtenu le même résultat que l'autre test SSMS ci-dessus.

REMARQUE : j'ai remarqué ce modèle dans le cadre d'un problème plus complexe, et j'ai voulu le simplifier afin de le publier ici.

10voto

Remus Rusanu Points 159382

Ce n'est qu'une supposition, mais il est probable que le client (Biztalk dans ce cas) appelle la procédure avec SET FMTONLY ON pour extraire la forme de l'ensemble des résultats, le cas échéant. Lorsque ce paramètre est activé (ON), toutes les branches sont "exécutées", y compris les blocs CATCH . Le résultat que vous voyez est exactement celui que vous obtiendrez dans SQL Profiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X