Que tal, buenos días... y gracias por su atención;
Tengo un problema y quiero dárselos a conocer por si me pueden ayudar... uso SQLServer y Visual Basic 2005.
Tengo un procedimiento almacenado que por Query Analyzer demora 10 minutos aprox. (por cierto, Ejecuta procesos de un servidor a otro)
El problema es que ahora es necesario ejecutarlo desde un webform, buscando como hacerlo encontré Services broker, talvez no sea la mejor opción, pero es la que encontré... (Si alguno conoce una mejor solución, favor hacerla saber...)
He bajado códigos de ejemplo, libros, etc., etc... (Ingles y no lo manejo) y no hay caso, no me logra funcionar y ya he dado vuelta tantas veces el código que hasta pena me da mostrarlo, por lo mismo agradecería mucho algún tipo de ayuda...
Bueno, la idea, es enviar el mensaje desde asp.net y que el SQL ejecute el SP, una vez finalizado envíe un email o algo que acusando el término del proceso...
Bueno, he aquí el código…
Use master
Go
/* Eliminar Base Datos. */
---------------------------------------------------------------------
IF EXISTS
(SELECT * FROM sys.databases WHERE name = 'Contabilidad')
Begin
Drop Database [Contabilidad]
End
Go
CREATE DATABASE [Contabilidad]
/* Activar SSB. */
---------------------------------------------------------------------
IF NOT EXISTS
(SELECT * FROM sys.databases WHERE name = 'Contabilidad' AND is_broker_enabled = 1)
Begin
Alter Database [Contabilidad] Set Enable_broker
End
Go
---------------------------------------------------------------------
Use [Contabilidad]
Go
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
--MENSAJES...
Create Message Type
[//Contabilidad/Voucher/Mensajes/Iniciar]
Authorization [dbo]
Validation = Well_formed_xml
Go
Create Message Type [//Contabilidad/Voucher/Mensajes/Respuesta]
Authorization [dbo]
Validation = Well_formed_xml
Go
--CONTRATO...
Create Contract
[//Contabilidad/Voucher/Contratos/GenerarVoucher]
Authorization [dbo]
(
[//Contabilidad/Voucher/Mensajes/Iniciar] Sent By Initiator,
[//Contabilidad/Voucher/Mensajes/Respuesta] Sent By Target
)
Go
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--COLAS...
Create Queue [dbo].[//Contabilidad/Voucher/Cola/Iniciar]
With Status = On,
Retention = On,
Activation
(
Status = On,
Procedure_name = [dbo].[Reca_Sp_IniciaServicioVoucher],
Max_queue_readers = 1,
Execute As N'dbo'
) On [PRIMARY]
Go
Create Queue [dbo].[//Contabilidad/Voucher/Cola/Respuesta]
With Status = On,
Retention = On,
Activation
(
Status = On,
Procedure_name = [dbo].[Reca_Sp_RespuestaServicios],
Max_queue_readers = 1,
Execute As N'dbo'
) On [PRIMARY]
Go
--SERVICIOS
Create Service
[//Contabilidad/Voucher/Servicios/Iniciar] Authorization [dbo]
On Queue [dbo].[//Contabilidad/Voucher/Cola/Iniciar]
(
[//Contabilidad/Voucher/Contratos/GenerarVoucher]
)
Go
Create Service [//Contabilidad/Voucher/Servicios/Respuesta] Authorization [dbo]
On Queue [dbo].[//Contabilidad/Voucher/Cola/Respuesta]
(
[//Contabilidad/Voucher/Contratos/GenerarVoucher]
)
Go
--PROCEDIMIENTOS...
If Exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Reca_Sp_IniciaServicioVoucher]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
Drop Procedure [dbo].[Reca_Sp_IniciaServicioVoucher]
Go
Create Procedure [dbo].[Reca_Sp_IniciaServicioVoucher]
WITH EXECUTE AS OWNER
As
SET NOCOUNT ON
Begin
--Variables Service Broker...
Declare @dialog UNIQUEIDENTIFIER,
@conversation_group_id UNIQUEIDENTIFIER,
@message_body XML,
@message_type_id Int,
@message_type_name NVARCHAR(128);
--Variables Error...
Declare @ErrorMsg Varchar(100);
BEGIN TRY
Begin Transaction
WAITFOR (
RECEIVE TOP(1)
@dialog = conversation_handle,
@message_type_id = message_type_id, --el tipo de mensaje recibido
@message_type_name = message_type_name,
@message_body =
CASE
WHEN validation = 'X' THEN CAST(message_body AS XML)
ELSE CAST(N'<none/>' AS XML)
END
FROM [dbo].[//Contabilidad/Voucher/Cola/Respuesta]
), TIMEOUT 60000;
---------------------------------------------------------------------
IF @@ROWCOUNT = 0 OR @@ERROR <> 0
Begin
--Rollback Transaction
Set @ErrorMsg = 'Error: NO existen Conversaciones disponibles.'
+ Space(1) + '- Sp: [Reca_Sp_IniciaServicioVoucher]';
--End Conversation @dialog
--Rollback Transaction
Raiserror (@ErrorMsg, 10, 1) With Log;
End
/* Mostrar el mensaje. */
---------------------------------------------------------------------
IF @message_type_name =
'//Contabilidad/Voucher/Mensajes/Iniciar'
Begin
Begin try
Declare @message XML
Set @message =
N'<RespuestaVoucher>
Claudio Becerra
</RespuestaVoucher>';
-- Enviar mensaje al remitente.
Exec Seguridad..sp_send_mail
@from = 'MonitorSQL@ParquesdeChile.cl',
@to = 'Cbecerra@ParquesdeChile.cl',--Destinatario
@subject = 'Creacion Servicio - Creación de Vouchers.',
@body = 'Testeo',
@bodytype = 'TextBody',
@output_mesg = Null,
@output_desc = Null;
--Exec Conta_Desarrollo..RECA_sp_GeneraRecaudacion_Masiva
-- @Mes_Hasta_ = 5,
-- @Year_Hasta_ = 2010,
-- @IdTipoComprobante_ = 3,
-- @IdProceso_ = 11,
-- @IdUsuario_ = '1';
/* Enviar Mensaje acusando Recepcion. */
---------------------------------------------------------------------
Send On Conversation @dialog
Message Type [//Contabilidad/Voucher/Mensajes/Respuesta](@message);
/* Finalizar Dialogo. */
---------------------------------------------------------------------
End Conversation @dialog;
End Try
Begin Catch
--Error, realizar una limpieza
--Rollback Transaction;
--print error (se reflejará en los registro de errores de SQL)
Print 'Error Service Broker [Reca_Sp_IniciaServicioVoucher]: ' + Error_message();
End Catch
End
/*
* Si se trata de "mensaje de fin de diálogo" o "mensaje de error"
* Finalizar Conversacion.(end dialog).
*/
If @message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
Or @message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
Begin
End Conversation @dialog;
End;
Else
Begin
--Tipo de mensaje no reconocido
Set @ErrorMsg = 'Tipo de mensaje recibido no reconocido: '
+ @message_type_name
+ Space(1) + 'Sp: [Reca_Sp_IniciaServicioVoucher]';
End Conversation @dialog
--Rollback Transaction
Raiserror (@ErrorMsg, 10, 1) With Log;
End --Tipo de mensaje no reconocido
Commit Transaction;
End Try
Begin Catch
Rollback Transaction
End Catch
End
Go
If Exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Reca_Sp_RespuestaServicios]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
Drop Procedure [dbo].[Reca_Sp_RespuestaServicios]
Go
Create Procedure [dbo].[Reca_Sp_RespuestaServicios]
As
SET NOCOUNT ON
While (1 = 1)
Begin
--Variables Service Broker...
Declare @dialog UNIQUEIDENTIFIER,
@conversation_group_id UNIQUEIDENTIFIER,
@message_body XML,
@message_type_id Int,
@message_type_name NVARCHAR(128);
--Variables Error...
Declare @ErrorMsg Varchar(100);
/* Begin transaction. */
---------------------------------------------------------------------
Begin Transaction
/* Get CONVERSATION GROUP ID. */
---------------------------------------------------------------------
Waitfor(
Get Conversation Group @conversation_group_id
From [dbo].[//Contabilidad/Voucher/Cola/Respuesta]
), Timeout 1000;
/* Rollback transaction y salir si no hay mensajes en la cola. */
---------------------------------------------------------------------
If (@@ROWCOUNT = 0)
Begin
Set @ErrorMsg = '[Reca_Sp_RespuestaServicios]: ROLLBACK TRANSACTION (GET CONVERSATION)'
Raiserror (@ErrorMsg, 10, 1) With Log;
Rollback Transaction
Break
End
PRINT @conversation_group_id
/* Tratar a todos los mensajes de este CONVERSATION GROUP. */
---------------------------------------------------------------------
WHILE (1 = 1)
BEGIN
/* Tratar a todos los mensajes uno a uno. */
---------------------------------------------------------------------
RECEIVE
TOP(1)
@dialog = conversation_handle,
@message_type_id = message_type_id, --el tipo de mensaje recibido
@message_type_name = message_type_name,
@message_body =
CASE
WHEN validation = 'X' THEN CAST(message_body AS XML)
ELSE CAST(N'<none/>' AS XML)
END
FROM [dbo].[//Contabilidad/Voucher/Cola/Respuesta]
WHERE conversation_group_id = @conversation_group_id ;
/*
* If there are no messages or error exists, go out from inner while.
* Si no hay mensajes de error o que no existe, salir de interior...
*/
---------------------------------------------------------------------
IF @@ROWCOUNT = 0 OR @@ERROR <> 0
Begin
Rollback Transaction
Break
End
/* Mostrar el mensaje. */
---------------------------------------------------------------------
IF @message_type_name =
'//Contabilidad/Voucher/Cola/Respuesta'
Begin
Begin try
Declare @message XML
Set @message =
N'<RespuestaVoucher>
Claudio Becerra
</RespuestaVoucher>';
-- Enviar mensaje al remitente.
Exec Seguridad..sp_send_mail
@from = 'MonitorSQL@ParquesdeChile.cl',
@to = 'Cbecerra@ParquesdeChile.cl',--Destinatario
@subject = 'Creacion Servicio - Creación de Vouchers.',
@body = 'Testeo',
@bodytype = 'TextBody',
@output_mesg = Null,
@output_desc = Null;
/* Finalizar Dialogo. */
---------------------------------------------------------------------
End Conversation @dialog;
End Try
Begin Catch
--Error, realizar una limpieza
Rollback Transaction;
--print error (se reflejará en los registro de errores de SQL)
Print 'Error Service Broker [Reca_Sp_RespuestaServicios]: ' + Error_message();
End Catch
End
/*
* Si se trata de "mensaje de fin de diálogo" o "mensaje de error"
* Finalizar Conversacion.(end dialog).
*/
If @message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
Or @message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
Begin
End Conversation @dialog;
End;
Else
Begin
--Tipo de mensaje no reconocido
Set @ErrorMsg = 'Tipo de mensaje recibido no reconocido: '
+ @message_type_name
+ Space(1) + 'Sp: [Reca_Sp_RespuestaServicios]';
End Conversation @dialog
Rollback Transaction
Raiserror (@ErrorMsg, 10, 1) With Log;
End --Tipo de mensaje no reconocido
End-- WHILE (1 = 1)
Commit Transaction
End;
Go