Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Managed Instance
En esta lección, aprenderá a iniciar una conversación que abarque dos bases de datos en la misma instancia del motor de base de datos. También aprenderá a completar un ciclo sencillo de mensajes de solicitud-respuesta y, a continuación, finalizar la conversación.
Procedimientos
Cambiar a la base de datos InitiatorDB
Copie y pegue el código siguiente en una ventana del Editor de consultas y, a continuación, ejecútelo para cambiar el contexto a la base de datos de InitiatorDB donde inicie la conversación.
USE InitiatorDB; GO
Iniciar una conversación y enviar un mensaje de solicitud
Copie y pegue el código siguiente en una ventana del Editor de consultas y ejecútelo para iniciar una conversación y enviar un mensaje de solicitud al TgtDB/2DBSample/TargetService en TargetDB. El código debe ejecutarse en un bloque porque se usa una variable para pasar un identificador de diálogo de
BEGIN DIALOGa laSENDinstrucción . El lote ejecuta laBEGIN DIALOGinstrucción para iniciar la conversación y crear un mensaje de solicitud. A continuación, usa el identificador de diálogo en unaSENDinstrucción para enviar el mensaje de solicitud en esa conversación. La últimaSELECTinstrucción muestra el texto del mensaje que se envió.DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RequestMsg AS NVARCHAR (100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//InitDB/2DBSample/InitiatorService] TO SERVICE N'//TgtDB/2DBSample/TargetService' ON CONTRACT [//BothDB/2DBSample/SimpleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION (@InitDlgHandle) MESSAGE TYPE [//BothDB/2DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Cambiar a la base de datos TargetDB
Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para cambiar el contexto a la
TargetDBbase de datos donde recibe el mensaje de solicitud y envía un mensaje de respuesta de vuelta a .InitiatorDBUSE TargetDB; GO
Recibir la solicitud y enviar una respuesta
Copie y pegue el código siguiente en una ventana del Editor de consultas y ejecútelo para recibir el mensaje de respuesta de TargetQueue2DB y enviar un mensaje de respuesta al iniciador. La
RECEIVEinstrucción recupera el mensaje de solicitud. A continuación, la siguienteSELECTinstrucción muestra el texto para que pueda comprobar que es el mismo mensaje que se envió en el paso anterior. LaIFinstrucción comprueba si el mensaje recibido es un tipo de mensaje de solicitud y si se usa unaSENDinstrucción para devolver un mensaje de respuesta al iniciador. También comprueba si laEND CONVERSATIONinstrucción se usa para finalizar el lado de destino de la conversación. La instrucción finalSELECTmuestra el texto del mensaje de respuesta.DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RecvReqMsg AS NVARCHAR (100); DECLARE @RecvReqMsgName AS sysname; BEGIN TRANSACTION; WAITFOR (RECEIVE TOP (1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue2DB), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg AS NVARCHAR (100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION (@RecvReqDlgHandle) MESSAGE TYPE [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
Cambiar a la base de datos InitiatorDB
Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para volver al contexto de la base de datos InitiatorDB, donde recibirá el mensaje de respuesta y finalizará la conversación.
USE InitiatorDB; GO
Recibir la respuesta y finalizar la conversación
Copie y pegue el código siguiente en una ventana del Editor de consultas. Después, ejecútelo para recibir el mensaje de respuesta y finalizar la conversación. La
RECEIVEinstrucción recupera el mensaje de respuesta de InitiatorQueue2DB. LaEND CONVERSATIONinstrucción finaliza el lado iniciador de la conversación. La últimaSELECTinstrucción muestra el texto del mensaje de respuesta para que pueda confirmar que es el mismo que lo que se envió en el paso anterior.DECLARE @RecvReplyMsg AS NVARCHAR (100); DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue2DB), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display received request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO