2010-12-07 5 views
11

Quel est le plus proche de pouvoir ajouter des informations de débogage de style log4net à un ensemble de procédures stockées? Certaines procédures permettent de déléguer le travail à d'autres procédures et je souhaite obtenir des informations de trace des deux. J'ai saupoudré impression et sélection des instructions à travers tout en les développant, et idéalement, aimerait être en mesure d'exécuter le proc dans différents modes selon que c'est le fonctionnement normal du dépannage et obtenir plus ou moins de sortie.Comment ajouter la sortie de suivi/débogage aux procédures stockées dans Sql Server (2008)

Dans ce cas particulier, le processus stocké primaire sera exécuté de manière répétée à partir d'un travail d'agent, mais peut être exécuté à partir du studio de gestion lors du dépannage.

Les processus utilisent déjà une table de consignation des erreurs et des fonctions de courrier électronique pour détecter les erreurs déclenchées. Le genre de chose que je cherche à retrouver est l'endroit où un problème de données d'entrée signifie que les données de sortie sont fausses mais les procs n'échouent pas complètement, et il serait utile de voir exactement ce qui a été fait à chaque étape. Quelles approches connaissez-vous pour produire des résultats significatifs et idéalement filtrables à l'aide de méthodes?

Une réponse par que nous puissions voir les ;-)

classement final Sur les réponses boîte bienvenue, telles que « ne pas - pas par avec le studio de gestion lorsque vous devez »

+0

Peut-être que ce SO peut aider http://stackoverflow.com/questions/3829201/sql-select-print-out-results-of-stored-procedue/3832356 # 3832356 – adopilot

Répondre

13

Piles des états d'impression

par exemple

print 'Doing something...' 
INSERT INTO foo(a) VALUES(1) 
print @@ROWCOUNT 

Cette réponse juste équilibre, car il est rond tranquille ici.

+1

Je préfère l'approche '[dbo]. [PrintMessage]' dans ma réponse pour le rendre facile à basculer sur Et hors. –

+0

Je suis d'accord, je vais juste avec l'opinion populaire pour garder la réponse populaire sur le dessus. –

+0

@TimAbell Ces sorties d'impression sont-elles conservées partout dans le serveur sql pour le dépannage? – Antoops

7

One l'approche pourrait être de vérifier si le proc est exécuté à partir de SSMS et de déclencher quelques Custom user configurable SQL Server Profiler events si c'est le cas. par exemple.

CREATE PROC foo 
AS 
DECLARE @debug bit = CASE WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' 
          THEN 1 
          ELSE 0 END 

DECLARE @userinfo nvarchar(128) 
DECLARE @userdata varbinary(8000) 

--Do some work here 

IF @debug = 1 
BEGIN 
--Do some custom logging 
    SET @userinfo = N'Some custom info' 
    SET @userdata = CAST('Some custom data' AS varbinary(8000)) 
    EXEC sp_trace_generateevent @eventid = 82 /*Use 82-91*/ 
           ,@userinfo = @userinfo 
           ,@userdata = @userdata 

END 

Bien que dans la pratique, je l'habitude d'utiliser quelque chose comme ci-dessous. Parfois avec du code supplémentaire pour consigner le message (et éventuellement l'étape et les valeurs d'état) dans une table en fonction des besoins. Cela permettrait de répondre à l'exigence "filtrable". Cela arrête l'impression du message, sauf si le APP_NAME indique qu'il est exécuté dans une version (en anglais) de SSMS et utilise NOWAIT pour que le message soit imprimé immédiatement plutôt que d'attendre que le tampon soit rempli.

CREATE PROCEDURE [dbo].[PrintMessage] @message   NVARCHAR(MAX), 
             @PrependCurrentTime BIT = 0 
AS 
    IF APP_NAME() LIKE 'Microsoft SQL Server Management Studio%' 
     BEGIN 
      DECLARE @CurrentTimeString VARCHAR(30); 

      SET @CurrentTimeString = '' 

      IF @PrependCurrentTime = 1 
      BEGIN 
       SET @CurrentTimeString = CONVERT(VARCHAR(19), GETDATE(), 20) + ' ' 
      END 

      RAISERROR('%s%s',0,1,@CurrentTimeString,@message) WITH NOWAIT 

     END 
+0

http://msdn.microsoft.com/fr-fr/library/ms177548.aspx msdn ref –

+1

nb. cela nécessite certains privilèges qui peuvent ne pas être disponibles dans votre environnement de production! (comme je l'ai découvert à la dure, doh!) –

+0

propre, probablement utile de fractionner la deuxième partie dans sa propre réponse –

1

N'ajoutez pas de sortie de suivi, mais effectuez simplement les étapes nécessaires avec le débogueur sql server management studio.

(Ajouté à voir si les gens préfèrent ce)

Questions connexes