GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

¿Cómo depurar un Procedimiento Almacenado, Función (UDF) o Trigger en SQL Server con Visual Studio? ¿Cómo depurar Transact-SQL con SQL Server 2008 y SSMS?


Una tarea imprescindible en el desarrollo y programación con SQL Server es la depuración de Procedimientos Almacenados, Desencadenadores (Triggers) y Funciones (UDF), una tarea que realizaremos con Visual Studio. El hecho de poder ejecutar paso a paso código Transact-SQL (T-SQL) de SQL Server, poder establecer Puntos de Interrupción (Break Point), examinar el contenido de las variables locales, globales y de sistema, modificar el valor de variables en tiempo de depuración, etc., resulta de gran ayuda. ¿Cómo depurar código SQL Server 2005? ¿Cómo depurar Transact-SQL SQL Server 2008? ¿Qué permisos o requisitos son necesarios para depurar SQL Server? ¿Cómo depurar desde SSMS?

Este artículo describe cómo depurar (y sus ventajas) Procedimientos Almacenados, Funciones (UDF) y Desencadenadores (Triggers) en SQL Server 2005 (ejecución paso a paso, establecimiento de puntos de interrupción, examinar valores de las variables, etc.) con Visual Studio 2005. Debe tenerse en cuenta, que en SQL Server 2005 no es posible depurar Transact-SQL directamente desde SSMS (SQL Server Management Studio). Los conocimientos que aquí se detallan, también se aplica a SQL Server 2008 y Visual Studio 2008, aunque al final del presente artículo se detalla la depuración con SQL Server 2008 y SQL Server Management Studio (incluso recordamos la depuración con SQL Server 2000 y el Query Analyzer... que años aquellos... ;-).

¿Qué nos permite depurar un Procedimiento Almacenado en SQL Server con Visual Studio? ¿Para qué sirve? La depuración de un Procedimiento Almacenado en SQL Server con Visual Studio nos permite poder ejecutar paso a paso el código de dicho Procedimiento Almacenado (pulsando la tecla F10), o bien, establecer puntos de interrupción y ejecutar el código del Procedimiento Almacenado hasta alcanzar los puntos de interrupción establecidos (pulsando la tecla F5). Además, en ambos casos podremos examinar el contenido de las variables locales, globales y de sistema de SQL Server, a través de las ventanas Variables Locales (Locals) e Inspección (Watch) de Visual Studio 2005, así como podremos modificar el valor de una variable en tiempo de depuración. Algo básico durante el desarrollo y programación de SQL Server (Transact-SQL).

¿Qué permisos son necesarios para poder depurar código en SQL Server 2005 con Visual Studio 2005?

Para poder depurar código en SQL Server 2005 con Visual Studio 2005 es necesario utilizar un Inicio de Sesión miembro de sysadmin. Es indiferente que se trate de un Inicio de Sesión de Windows o de un Inicio de Sesión de SQL Server, siempre cuando el Inicio de Sesión sea miembro de sysadmin.

Si no cumplimos los permisos requeridos para la Depuración de SQL Server, e intentamos depurar código de SQL Server, podríamos obtener el siguiente error:

User 'dbo' could not execute stored procedure 'master.dbo.sp_enable_sql_debug' on SQL Server VSQL01. Click Help for more information.

En caso de tener instalado Visual Studio en español, el mensaje de error sería el siguiente:

El usuario 'dbo' no pudo ejecutar el procedimiento almacenado 'master.dbo.sp_enable_sql_debug' en SQL Server VSQL01.

El procedimiento almacenado sp_enable_sql_debug, es un procedimiento almacanado extendido del sistema, que en SQL Server 2005 y en SQL Server 2008 podremos encontrar bajo el esquema sys (es decir, master.sys.sp_enable_sql_debug).

Quizás, pueda parecer que los permisos o requisitos necesarios para poder depurar código en SQL Server, son demasiado elevados. Es importante tener en cuenta que la depuración de código SQL Server está diseñada para ser utilizada en instancias SQL Server locales o servidores SQL Server de desarrollo, y en consecuencia, no es recomendable utilizar la depuración de código SQL Server (SQL Server debugging) en entornos de producción.

¿Cómo depurar un Procedimiento Almacenado en SQL Server 2005 con Visual Studio 2005?

Para depurar un Procedimiento Almacenado en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), lo cual consiste sencillamente en abrir la ventana Explorador de Servidores (Server Explorer) de Visual Studio 2005, agregar una nueva Conexión de Datos (Data Connections) a la instancia SQL Server deseada (si no existe una conexión creada anteriormente, claro), hacer click con el botón derecho sobre el Procedimiento Almacenado deseado, y en el menú contextual, seleccionar la opción Ir a Procedimiento Almacenado (Step into Procedure), pudiendo establecer los valores deseados de los parámetros del Procedimiento Almacenado (en caso de tener parámetros, claro) para la ejecución en modo depuración.

Cómo iniciar la depuración de un Procedimiento Almacenado en SQL Server 2005 con Visual Studio 2005.

Llegados a este punto, tenemos dos opciones:

  • Pulsar F5 (Continue - Continuar). Ejecutar hasta el siguiente punto de interrupción, o en su defecto hasta el final del Procedimiento Almacenado que se está depurando.
  • Pulsar F10 (Step Over - paso a paso por el proceso actual). Ejecutar paso a paso, pulsando F10 para la ejecución de cada sentencia del Procedimiento Almacenado, sin profundizar. Es decir, si al ejecutar el Procedimiento Almacenado, salta un desencadenador (Trigger) o se invoca a otro Procedimiento Almacenado o Función (UDF), no se entrará a ejecutar paso a paso ni dicho Desencadenador (Trigger), ni dicho Procedimiento Almacenado ni dicha Función (UDF).
  • Pulsar F11 (Step Into - paso a paso por instrucciones). Ejecutar paso a paso, pulsando F11 para la ejecución de cada sentencia del Procedimiento Almacenado, profundizando en objetos internos. Es decir, si al ejecutar el Procedimiento Almacenado, salta un desencadenador (Trigger) o se invoca a otro Procedimiento Almacenado o Función (UDF), se entrará a ejecutar paso a paso dicho Desencadenador (Trigger), Procedimiento Almacenado o Función (UDF).
  • Pulsar Shift+F11 (Step Out - paso a paso para salir). Si utilizamos F11 (Step Into) para ejecutar paso a paso objetos "internos", podemos utilizar Shift+F11 (Step Out) para salir de la depuración de dichos objetos internos y continuar la depuración paso a paso del objeto principal.

En todo momento, podremos evaluar el valor de variables locales, para lo cual podemos utilizar la ventana Variables Locales (Locals) de Visual Studio 2005, disponible desde Depurar -> Ventanas -> Variables Locales (Debug -> Windows -> Locals). Del mismo modo, podremos evaluar otras variables, como las variables del sistema, desde la ventana Inspección (Watch) de Visual Studio 2005, teniendo en cuenta que en la ventana Inspección (Watch), también podemos evaluar las variables locales, y además, para evaluar variables del sistema (ej: @SERVERNAME, @@ERROR, etc.) será necesario añadirlas a la ventana Inspección (Watch). Resulta de gran interés el hecho de poder modificar el valor de las variables en tiempo de depuración, para lo cual, deberemos utilizar las ventanas Variables Locales (Locals) o Inspección (Watch) de Visual Studio 2005 para modificar el valor de las variables deseadas. A continuación se muestra una pantalla capturada de Visual Studio 2005 for Database Professional (DBPro), depurando un Procedimiento Almacenado en SQL Server 2005 (ojo, que el menu Debug es un pelín diferente al de Visual Studio 2005 Professional, aunque se pueda hacer lo mismo: F10, F11, Shift+F11, etc.).

Cómo depurar un procedimiento almacenado en SQL Server 2005 con Visual Studio 2005. Examinar y modificar variables en tiempo de depuración. Depurar Transact-SQL en SQL Server 2005 con Visual Studio 2005 for Database Professional (DBPro).

Es importante tener en cuenta que al realizar Depuración Directa de Base de Datos (Direct Database Debugging), si el Procedimiento Almacenado que se está depurando utiliza algún otro Procedimiento Almacenado, Función (UDF) o Desencadenador (Trigger), al ejecutar paso a paso el Procedimiento Almacenado no se accederá a la ejecución paso a paso (depuración) de dicho Procedimiento Almacenado, Función y/o Desencadenador (Trigger), excepto que establezcamos un punto de interrupción en la Función (UDF) y/o Desencadenador (Trigger) deseado, o excepto que utilicemos la opción Step Into (F11).

¿Cómo establecer un Punto de Interrupción con Visual Studio 2005 en un Procedimiento Almacenado, Función (UDF) o Desencadenador (Trigger) de SQL Server? Pues muy fácil, tan sólo es necesario abrir el objeto deseado (Procedimiento, Función ó Trigger) desde la ventana Explorador de Servidores de Visual Studio 2005, y establecer el Punto de Interrupción en el lugar deseado, ya sea desde el menú contextual (click con el botón derecho en la línea de código deseada, y después, utilizar el submenú Punto de Interrupción – Break Point – del menú contextual), o bien haciendo click en el margen izquierdo en la línea deseada de la ventana de código (se pondrá una bola roja en el margen al crear el Punto de Interrupción). En cualquier caso, se debe establecer los puntos de interrupción antes de empezar a depurar, pues una vez iniciada la depuración o ejecución paso a paso no será posible incluir nuevos puntos de interrupción (bueno... si será posible pero sólo en el objeto que estamos depurando).

¿Cómo depurar un Desencadenador (Trigger) en SQL Server 2005 con Visual Studio 2005?

Para depurar un Desencadenador (Trigger) en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), del mismo modo que hicimos en el caso anterior (depuración de Procedimientos Almacenados en SQL Server 2005). Sin embargo, debemos tener en cuenta que a un Desencadenador (Trigger) no se le puede invocar directamente, por lo cual, lo que podemos hacer es crear un Procedimiento Almacenado cuyo código fuente invoque al Desencadenador (Trigger) que se desea depurar (o bien, utilizar un Procedimiento Almacenado existente que también genere la ejecución del Desencadenador), de tal modo, que deberemos establecer un punto de interrupción en el código del Desencadenador (Trigger) e iniciar la depuración de un Procedimiento Almacenado que ejecute el Desencadenador (Trigger) deseado (el truco del almendruco ;-). Otra opción, es utilizar Step Into (F11 - paso a paso por instrucciones) en vez de Step Over (F10 - paso a paso por el proceso actual) para la depuración de dicho Procedimiento Almacenado, y así conseguir iniciar la depuración del Desencadendor (Trigger) deseado. Con cualquiera de estos dos métodos, habremos conseguido nuestro objetivo.

¿Cómo depurar una Función Definida por el Usuario (UDF: User Defined Function) en SQL Server 2005 con Visual Studio 2005?

Para depurar una Función Definida por el Usuario (UDF: User Defined Function) en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), lo cual consiste sencillamente en abrir la ventana Explorador de Servidores (Server Explorer) de Visual Studio 2005, agregar una nueva Conexión de Datos (Data Connections) a la instancia SQL Server deseada (si no existe una conexión creada anteriormente, claro), hacer click con el botón derecho sobre la Función deseada, y en el menú contextual, seleccionar la opción Ir a Función (Step into Function), pudiendo establecer los valores deseados de los parámetros de la Función (en caso de tener parámetros, claro) para la ejecución en modo depuración. Llegados a este punto, tenemos dos opciones:

  • Pulsar F5 (Continue - Continuar). Ejecutar hasta el siguiente punto de interrupción, o en su defecto hasta el final de la Función (UDF) que se está depurando.
  • Pulsar F10 (Step Over - paso a paso por el proceso actual). Ejecutar paso a paso, pulsando F10 para la ejecución de cada sentencia de la Función (UDF) que se está depurando, sin profundizar. Es decir, si al ejecutar la Función (UDF), se invoca a otra Función (UDF), no se entrará a ejecutar paso a paso dicha Función (UDF) "interna".
  • Pulsar F11 (Step Into - paso a paso por instrucciones). Ejecutar paso a paso, pulsando F11 para la ejecución de cada sentencia de la Función (UDF) que se está depurando, profundizando en objetos internos. Es decir, si al ejecutar la Función (UDF), se invoca a otra Función (UDF), se entrará a ejecutar paso a paso dicha Función (UDF) "interna".
  • Pulsar Shift+F11 (Step Out - paso a paso para salir). Si utilizamos F11 (Step Into) para ejecutar paso a paso objetos "internos", podemos utilizar Shift+F11 (Step Out) para salir de la depuración de dichos objetos internos y continuar la depuración paso a paso del objeto principal.

En todo momento, podremos evaluar el valor de variables locales, para lo cual podemos utilizar la ventana Variables Locales (Locals) de Visual Studio 2005, disponible desde Depurar -> Ventanas -> Variables Locales (Debug -> Windows -> Locals). Del mismo modo, podremos evaluar otras variables, como las variables del sistema, desde la ventana Inspección (Watch) de Visual Studio 2005, teniendo en cuenta que en la ventana Inspección (Watch), también podemos evaluar las variables locales, y además, para evaluar variables del sistema (ej: @SERVERNAME, @@ERROR, etc.) será necesario añadirlas a la ventana Inspección (Watch). Resulta de gran interés el hecho de poder modificar el valor de las variables en tiempo de depuración, para lo cual, deberemos utilizar las ventanas Variables Locales (Locals) o Inspección (Watch) de Visual Studio 2005 para modificar el valor de las variables deseadas.

Del mismo modo que cuando hablamos de la depuración de Procedimientos Almacenados, si desde una Función (UDF) accedemos a otros objetos de base de datos que deseemos depurar (ej: funciones anidadas que deseemos ejecutar paso a paso), podremos establecer puntos de interrupción en dichos objetos, para así poder depurarlos, o bien utilizar Step Into (F11 - paso a paso por instrucciones) en vez de Step Over (F10 - paso a paso por el proceso actual) para la depurar. Recordar, como ya comentamos, que deberemos agregar los puntos de interrupción antes de empezar a depurar.

¿Cómo depurar con SQL Server 2008 y Visual Studio 2008?

Todo lo comentado anteriormente para depurar SQL Server 2005 con Visual Studio 2005, se aplica también para depurar SQL Server 2008 con Visual Studio 2008. Sin embargo, se incorporan alguna nueva funcionalidad.

Quizás la más importante, es que con SQL Server 2008 se puede depurar desde SQL Server Management Studio (SSMS), directamente, sin necesidad de utilizar Visual Studio (joder, que gusto ;-). Esta es una gran mejora, que muchos esperábamos y deseabamos desde la ansia, y que por fin tenemos. Bueno... recuerdo que con SQL Server 2000 se podía depurar directamente desde la herramienta Query Analyzer (T-SQL Debugger), como se muestra en la siguiente imagen:

Cómo depurar un procedimiento almacenado en SQL Server 2000 con Query Analyzer.

De hecho, al depurar con SQL Server 2000, también podíamos ejecutar código paso a paso, pues teníamos las opciones Step Into (F11), Step Over (F10), Step Out (Shift+F11) y Continue directamente desde Query Analyzer. Por supuesto, al depurar con SQL Server 2000 también podíamos establecer Puntos de Interrupción (Break Points), examinar los valores de las variables, modificar los valores de las variables en tiempo de depuración, etc. A continuación se muestra un pantallazo de un servidor virtual SQL Server 2000 Developer del Laboratorio de GuilleSQL, donde se representan dichas funcionalidades de Query Analyzer y de depuración de SQL Server 2000.

Cómo depurar un procedimiento almacenado en SQL Server 2000 con Query Analyzer. Depurar SQL Server 2000 Step Into, Step Over, Step Out y Continue con Query Analyzer.

Ahora, con SQL Server 2008 podemos depurar código T-SQL desde SQL Server Management Studio (como se hacía antaño ;-), aunque también es cierto que existe alguna pequeña diferencia. La primera diferencia salta a la vista, y se trata del nuevo menú Debug incluido en SQL Server Management Studio (SSMS). A través de este menú, y directamente desde una ventana de consulta de SQL Server Management Studio, podremos iniciar la depuración, como se muestra en la siguiente pantalla capturada del Laboratorio de GuilleSQL.

Con SQL Server 2008 podemos depurar código T-SQL desde SQL Server Management Studio. Nuevo menú Debug incluido en SQL Server Management Studio (SSMS) en SQL Server 2008

Esto es en sí, una gran novedad, ya que implica que ahora con SQL Server 2008 podemos depurar directamente un Batch de Transact-SQL (T-SQL). Con esto, lo que quiero decir, es que antes sólo podíamos depurar objetos de SQL Server, como por ejemplo, depurar un procedimiento almacenado (caso típico). Ahora, podemos tener un trozo cualquiera de código Transact-SQL, quizás de algún Script que ejecutamos periódicamente en nuestro día a día, e iniciar la depuración de dicho trozo de código Transact-SQL. No es necesario crear un Procedimiento Almacenado, para poder depurar dicho código, como teníamos que hacer antes para salir del apuro...

Así, una vez iniciada la depuración del Batch, podemos utilizar las opciones del menú Debug de SQL Server 2008 para depurar nuestro código Transact-SQL, e incluso depurar nuestros objetos de SQL Server, es decir, utilizar las opciones Step Into (F11), Step Over (F10), Step Out (Shift+F11) y Continue, así como utilizar Puntos de Interrupción, etc.

Cómo depurar en SQL Server 2008 con Query Analyzer. Depurar SQL Server 2008 Step Into, Step Over, Step Out y Continue con SQL Server Management Studio (SSMS).

La verdad que la mejora es de agradecer, ya que aquí han tenido un gran detalle los señores de Microsoft del equipo de producto de SQL Server 2008 (mi más sinceras gracias).

Y poco más que contar de momento. Como siempre, espero que el contenido del artículo os guste ;-)



Comentarios

xatursa - 16/09/2011 (UTC)
Guille,
¿desde Visual Studio .NET 2003 se puede depurar?
He puesto en el grupo sysadmin mi usuario (sesion) pero, me pone que no tengo permisos sobre master.sp_sdidebug.

En mi SQL Server 2005 no tengo este procedure.

¿Que puedo hacer?


GuilleSQL - 16/09/2011 (UTC)
No te puedo decir... hace años que no toco VS2003. Lo siento.


LC - 27/01/2013 (UTC)
Guille,

Consulta:
Depurando un procedimiento almacenado este no impacta en la base de datos, verdad? Como que lo ejecuta en el "aire" por decirlo de alguna manera.
Por otro lado, cuando en VS 2005 quiero depurar uno mediante click derecho sobre el sp, y luego "Step into Procedure" me sale el siguiente msj de error:

"Unable to access the SQL Server debugging interface. The visual studio debugger cannot connect to the remote computer. Unable to initiate DCOM communication. Please Help for assitance."

Agradecerías me puedas evacuar esas dudas!
Gracias!


CH - 20/05/2014 (UTC)
Guille salu2.
En el menú contextual del procedimiento en mi Visual Studio no aparece la opción IR AL PROCEDIMIENTO, que debo hacer para que aparezca.

gracias!



Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Marzo de 2019 (1)
Octubre de 2018 (1)
Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.