Introducción
En los artículos anteriores hemos analizado los eventos que nos ofrece SQL Server y que podemos seguir. Luego hemos aprovechado la infraestructura para guardar estos eventos en una cola. Es hora de preparar el informe que nos diga todo lo que ha ocurrido en el servidor de base de datos.
Revisar la Cola
La manera más fácil de probar la extracción de los eventos es consultar la cola. Como los eventos se guardan en formato XML, aunque en un campo VARBINARY(MAX), lo primero es sacar cada fila (cada evento) convertida.
Una vez que tenemos cada mensaje en XML nativo, podemos realizar una consulta XQuery. Microsoft recomienda usar el método value porque es más eficiente en este caso. Como SQL Server sólo admite que devuelva una única fila, es obligatorio asegurarse pidiendo el primero, en la expresión XQuery. Como conocemos por la definición que vimos en el primer artículo, cómo llegar a los datos del evento, podemos construir muy fácilmente la consulta.
Receive
Debemos distinguir entre consultar una cola y consumir sus mensajes. Aunque una cola permite la consulta mediante la instrucción SELECT , no permite que se pueda alterar con el resto de instrucciones DML. Solo se pueden usar las instrucciones de Service Broker. Por lo tanto, para recuperar los mensajes, la instrucción correcta es RECEIVE. Aunque en las pruebas podemos emplear perfectamente SELECT para no quitar los mensajes de la cola.
Si se omite la instrucción WHERE, se devuelven los mensajes del siguiente grupo de conversación disponible. Como por defecto se crean las colas para que no retengan los mensajes, dado que mejora el rendimiento al no crecer continuamente las colas, la instrucción RECEIVE quita los mensajes.
Por lo tanto, una ventaja que tiene consultar la cola es que se reciben todos los mensajes independientemente de la conversación a la que pertenezcan. Pero es recomendable hacerlo con la sugerencia WITH (NOLOCK) para no bloquear las aplicaciones que usan la cola. En nuestro caso, dado la poca cantidad de mensajes, no sería necesario, pero lo ponemos para recordarlo.
Como la cola puede tener varias conversaciones, tenemos que crear un bucle para vaciarla completamente en una variable de tabla que guarde los mensajes:
Extraer los Mensajes
Una vez que hemos vaciado la cola, si tenemos mensajes en la variable de tabla, lo primero es convertirlos a una forma tabular como hemos visto en el punto anterior. Lo ponemos para mayor claridad:
Convertir en HTML
Como queremos enviar en un mensaje de correo electrónico, con los datos en formato tabla, los datos de la expresión de tabla común anterior, hay que añadir las etiquetas HTML. Para ello, en SQL Server se usa un truco muy común y muy práctico que es la expresión FOR XML PATH(‘tr’), TYPE que añade el marcador HTML adecuado de inicio de línea de tabla, más el nombre del campo td = que añade el marcador HTML de separación de campos y por último el nombre del campo donde va a venir todo lo ponemos donde va el nombre de la tabla común que hemos llamado HtmlRows. Por lo tanto, la siguiente expresión de tabla común es:
Finalizar el mensaje
Nos falta poner el encabezado HTML alrededor de los datos de la tabla para tener nuestro mensaje completado. Añadimos el título y los datos de la tabla quedando el mensaje listo para ser enviado. Todo muy fácil una vez que conocemos los trucos:
Y ya lo tenemos todo preparado para enviarlo por correo. El procedimiento lo usamos en un trabajo del Agente SQL Server que se ejecute cada día a una hora que no sea muy molesta –no hay por qué tener estos mensajes a primera hora, ¿verdad?– y ya lo tenemos completado.
Como hemos hablado, también se puede crear un desencadenador que mande los mensajes cuando se produzca el evento (asíncronamente, claro o en vez de enviar los datos por correo guardarlos en una tabla. El formato base ya lo tenemos.
Resumen
En este último artículo de la serie hemos visto cómo procesar los eventos guardados en la cola. Para ello hemos preparado el esqueleto de un procedimiento almacenado que extrae todos los mensajes de la cola, saca los datos relevantes y lo formatea mediante HTML para enviarlo por correo.
Dejar un comentario
¿Quieres unirte a la conversación?¡Siéntete libre de contribuir!