2009-05-14 14 views
5

Estoy investigando an odd error from a SQL Server 2005 stored procedure que no puedo reproducir llamándolo directamente desde Management Studio.¿Cómo puedo adjuntar y depurar un procedimiento almacenado de SQL Server almacenado?

Por lo tanto me gustaría ser capaz de:

  • establecer un punto de interrupción en el procedimiento almacenado
  • espera para el procedimiento que se llama el exterior y el punto de interrupción golpeó
  • ver los valores de la -pasajero en parámetros
  • paso a través del procedimiento almacenado

Es esto posible, y si es así, ¿cómo?

Respuesta

2

puede probar con el "Explorador de servidores" de Visual Studio, pero el sqlserver necesita ser configurado para permitir una depuración. Aquí hay alguna información: http://www.4guysfromrolla.com/articles/051607-1.aspx. Pero creo que primero deberías probar Profiler como Eppz decir. :)

+0

El artículo vinculado muestra cómo adjuntar y depurar un procedimiento almacenado como necesito (+1), sin embargo, supone que el proceso de conexión es ASP.NET. En mi caso es una aplicación Java, así que necesito un poco más de información ... –

+0

El enlace muestra cómo depurar con Visual Studio. Realmente no necesita ningún código. Solo tiene que ir al menú Ver-> Server Explorer y agregar la conexión en la pestaña "explorador del servidor". No estoy seguro de que pueda hacer lo mismo con cualquier entorno de desarrollo Java (Especialmente si usa SQL Server .... :(...) – Lucas

+0

Se aceptó esta respuesta ya que explica cómo adjuntar a un procedimiento almacenado en ejecución que era el punto de la pregunta. Gracias. –

0

Uso SQL Profiler para ver lo que está sucediendo cuando el procedimiento se llama y qué params se pasan en.

+0

¿Esto me permitirá seguir el procedimiento también? –

+0

No, desafortunadamente no. Podrá ver lo que se está ejecutando y una copia/pegado rápido en Management Studio le permitirá ejecutar el código nuevamente. Agregue algunas instrucciones de impresión para asegurarse de que el proceso está haciendo lo que cree que está haciendo. – Eppz

0

Utilizaría una combinación de SQL Profiler e instrucciones de impresión dentro de su declaración SQL. No estoy seguro de una forma de pasar línea por línea, pero usar Profiler en combinación con print y select statements (si usa tablas temporales) para ver su contenido a medida que se ejecuta el proceso arrojará rápidamente luz sobre lo que está sucediendo.

1

Actualización: No estoy seguro de si hay una forma de conectarlo a un proceso almacenado en ejecución. Puede usar el generador de perfiles para obtener un seguimiento en tiempo real de las declaraciones que se ejecutan (SP: StmtStarting). Consulte también Apex SQL Debug que parece tener más capacidades y está disponible como un complemento para Management Studio.

Si tiene Visual Studio, es fácil de depurar:

Debugging Stored Procedures in Visual Studio 2005

más respuestas aquí: What’s your favored method for debugging MS SQL stored procedures?

+0

Este artículo solo parece describir la depuración de un procedimiento almacenado que se inicia a través de Visual Studio. Quiero poder * adjuntar * a un procedimiento almacenado que ya se está ejecutando ... –

1

Si no puede recorrer el código, aquí hay dos maneras:

# 1 concatenar una cadena e insertarla en un archivo de registro.

Declarar una variable como: información de depuración

DECLARE @Loginfo varchar(7500) 

anexados en él a medida que avanza a través del código:

SET @LogInfo=ISNULL(@LogInfo)+'#01> @x='+COALESCE(CONVERT(varchar(10),@x),'NULL') 
.. 
SET @LogInfo=ISNULL(@LogInfo)+'#02>' 
.. 
SET @LogInfo=ISNULL(@LogInfo)+'#03> top loop' 

en todos los puntos de salida (después de las reversiones) añadir:

INSERT INTO YourLogTable VALUES (..., @ LogInfo)

dependiendo del uso de la transacción y su error en particular, puede insertar muchas veces sin temor a deshacerse, por lo que necesitará cambiar esto a su situación.

# 2 de escritura a un archivo de texto en el servidor cuadrados

esto puede no ser una opción, ya que utiliza el procedimiento almacenado xp_cmdshell muy inseguro. Sin embargo, si se puede usar eso y si las transacciones de la aplicación de llamadas están causando un problema intente crear este procedimiento almacenado:

CREATE PROC log_message 
    @Message   varchar(255) 
    ,@FileName  varchar(100) 
    ,@OverWrite  char(1) = 'N' 
AS 

/* 
Log messages to server side text files from stored procedures/triggers/sql scripts 

    Input parameters: 
     Message - message to put in the log file 
     FileName - path and name of the file to log the message into 
     OverWrite - 'Y'=overwrite entire file with current message 
        'N'=append current message onto end of file 

    Return code: 
     0 - everything was fine 
     1 - there was an error 


     NOTE: the command to log the message can not be longer than 255 characters, 
       as a result the message and file name should be less than 245 chars combined 


    Example: EXEC log_message 'Duplicates found','C:\logfile.txt', 'N' 
     append the "Duplicates found" message onto the server's "C:\logfile.txt" file 

*/ 

BEGIN 
    SET NOCOUNT ON 

    DECLARE @ExecuteString VARCHAR(255) --command string can only be 255 chars long 
    DECLARE @ReturnValue   int 

    --build command string 
    SET @ExecuteString = RTRIM('echo ' + COALESCE(LTRIM(@Message),'-') 
     + CASE WHEN (@OverWrite = 'Y') THEN ' > ' ELSE ' >> ' END + RTRIM(@FileName)) 

    --run command string 
    EXEC @ReturnValue=master..xp_cmdshell @ExecuteString 
    --IF @ReturnValue!=0 
    -- PRINT 'command failed, return value='+CONVERT(varchar(40),@ReturnValue) 

    RETURN @ReturnValue 

    SET NOCOUNT OFF 
END 

espolvorear llama a este procedimiento de éstos a través de su código de escribir lo que necesita en un archivo en el servidor

+0

Las transacciones son que se maneja en la aplicación de llamada, así que el # 1 es difícil (aunque no imposible). Si no puedo hacer que la depuración funcione sin cambiar el código del procedimiento almacenado, le daré al # 2 una oportunidad. +1 –

Cuestiones relacionadas