1. CREATE FUNCTION [dbo].[sb_SelectInitiatorConversationHandle](
  2. @InitiatorServiceName SYSNAME,
  3. @TargetServiceName SYSNAME
  4. )
  5. RETURNS UNIQUEIDENTIFIER AS BEGIN
  6. DECLARE @ConversationHandle UNIQUEIDENTIFIER;
  7. SELECT TOP(1) @ConversationHandle = [conversation_handle]
  8. FROM sys.conversation_endpoints WITH (NOLOCK)
  9. WHERE
  10. far_service = @TargetServiceName AND
  11. service_id = (
  12. SELECT service_id
  13. FROM sys.services WITH (NOLOCK)
  14. WHERE name = @InitiatorServiceName
  15. )
  16. AND is_initiator = 1;
  17. RETURN @ConversationHandle;
  18. END;
  19. GO
  20. CREATE FUNCTION [dbo].[sb_SelectTargetConversationHandle](
  21. @InitiatorServiceName SYSNAME,
  22. @TargetServiceName SYSNAME
  23. )
  24. RETURNS UNIQUEIDENTIFIER AS BEGIN
  25. RETURN (
  26. SELECT conversation_handle
  27. FROM sys.conversation_endpoints WITH (NOLOCK)
  28. WHERE conversation_id = (
  29. SELECT TOP(1) conversation_id
  30. FROM sys.conversation_endpoints WITH (NOLOCK)
  31. WHERE
  32. far_service = @TargetServiceName AND service_id = (
  33. SELECT service_id
  34. FROM sys.services WITH (NOLOCK)
  35. WHERE name = @InitiatorServiceName
  36. )
  37. AND is_initiator = 1
  38. )
  39. AND is_initiator = 0
  40. );
  41. END;
  42. GO
  43. ALTER PROCEDURE [dbo].[sb_InitializeConversation](@InitiatorServiceName SYSNAME, @TargetServiceName SYSNAME, @InitiatorConversationHandle UNIQUEIDENTIFIER = '00000000-0000-0000-0000-000000000000' OUTPUT, @TargetConversationHandle UNIQUEIDENTIFIER = '00000000-0000-0000-0000-000000000000' OUTPUT) AS BEGIN
  44. SET NOCOUNT ON;
  45. DECLARE @message NVARCHAR(MAX);
  46. IF (SELECT is_broker_enabled FROM sys.databases WHERE database_id = DB_ID()) = 0 BEGIN
  47. SELECT @message = 'Service broker is disabled for database ''' + DB_NAME() + '''. Use "ALTER DATABASE ' + QUOTENAME(DB_NAME()) + ' SET ENABLE_BROKER" to enable it.';
  48. RAISERROR(@message, 11, 1);
  49. RETURN -1;
  50. END;
  51. IF NOT EXISTS (SELECT * FROM sys.services WHERE name = @InitiatorServiceName) BEGIN
  52. SELECT @message = 'Initiator service ''' + @InitiatorServiceName + ''' does not exist on the local server. Service names are case- and accent-sensitive.';
  53. RAISERROR(@message, 11, 1);
  54. RETURN -1;
  55. END;
  56. IF NOT EXISTS (SELECT * FROM sys.services WHERE name = @TargetServiceName) BEGIN
  57. SELECT @message = 'Target service ''' + @TargetServiceName + ''' does not exist on the local server. Service names are case- and accent-sensitive. This procedure cannot be used to create conversations to remote services.';
  58. RAISERROR(@message, 11, 1);
  59. RETURN -1;
  60. END;
  61.  
  62. DECLARE @queueName SYSNAME;
  63. SELECT @queueName = dbo.sb_SelectServiceQueue(@TargetServiceName);
  64.  
  65. DECLARE @xml NVARCHAR(MAX);
  66. DECLARE @PARAMETERS NVARCHAR(MAX);
  67. SELECT @xml =
  68. 'BEGIN TRY' + CHAR(13) + CHAR(10) +
  69. ' BEGIN' + CHAR(13) + CHAR(10) +
  70. ' BEGIN DIALOG CONVERSATION @initiatorConversationHandle FROM SERVICE ' + @InitiatorServiceName + ' TO SERVICE ''' + @TargetServiceName + ''' WITH ENCRYPTION = OFF; ' + CHAR(13) + CHAR(10) +
  71. ' SEND ON CONVERSATION @initiatorConversationHandle(''''); ' + CHAR(13) + CHAR(10) +
  72. ' DECLARE @dummy TABLE([message] VARBINARY(MAX)); ' + CHAR(13) + CHAR(10) +
  73. ' SELECT @targetConversationHandle = conversation_handle FROM sys.conversation_endpoints WHERE conversation_id = (SELECT conversation_id FROM sys.conversation_endpoints WHERE conversation_handle = @initiatorConversationHandle) AND is_initiator = 0;' + CHAR(13) + CHAR(10) +
  74. ' IF @@ROWCOUNT = 0 RAISERROR(''Send from ''''' + @InitiatorServiceName + ''''' to ''''' + @TargetServiceName + ''''' failed. Contract DEFAULT not mapped?'', 11, 0);' + CHAR(13) + CHAR(10) +
  75. ' RECEIVE message_body FROM ' + @queueName + ' INTO @dummy WHERE conversation_handle = @targetConversationHandle;' + CHAR(13) + CHAR(10) +
  76. ' IF @@ROWCOUNT = 0 RAISERROR(''Receive from ''''' + @InitiatorServiceName + ''''' to ''''' + @TargetServiceName + ''''' failed.'', 11, 0);' + CHAR(13) + CHAR(10) +
  77. ' END' + CHAR(13) + CHAR(10) +
  78. 'END TRY' + CHAR(13) + CHAR(10) +
  79. 'BEGIN CATCH' + CHAR(13) + CHAR(10) +
  80. ' BEGIN' + CHAR(13) + CHAR(10) +
  81. ' DECLARE @message NVARCHAR(MAX) = ERROR_MESSAGE(); ' + CHAR(13) + CHAR(10) +
  82. ' IF @initiatorConversationHandle IS NOT NULL ' + CHAR(13) + CHAR(10) +
  83. ' END CONVERSATION @initiatorConversationHandle WITH CLEANUP;' + CHAR(13) + CHAR(10) +
  84. ' SET @initiatorConversationHandle = NULL;' + CHAR(13) + CHAR(10) +
  85. ' SET @targetConversationHandle = NULL;' + CHAR(13) + CHAR(10) +
  86. ' RAISERROR(@message, 11, 0);' + CHAR(13) + CHAR(10) +
  87. ' END' + CHAR(13) + CHAR(10) +
  88. 'END CATCH';
  89. ;
  90. SELECT @PARAMETERS = N'@initiatorConversationHandle UNIQUEIDENTIFIER OUTPUT, @targetConversationHandle UNIQUEIDENTIFIER OUTPUT';
  91. --PRINT @xml;
  92. DECLARE @ReturnTable INT;
  93. SELECT @ReturnTable = CASE WHEN NOT (@InitiatorConversationHandle IS NULL AND @TargetConversationHandle IS NULL) THEN 1 ELSE 0 END;
  94. DECLARE @RESULT INT;
  95. EXEC @RESULT = SP_EXECUTESQL @xml, @PARAMETERS, @initiatorConversationHandle = @initiatorConversationHandle OUTPUT, @targetConversationHandle = @targetConversationHandle OUTPUT;
  96. IF @RESULT <> 0 OR @InitiatorConversationHandle IS NULL OR @TargetConversationHandle IS NULL RETURN -1;
  97. IF @ReturnTable = 1
  98. SELECT @initiatorConversationHandle AS InitiatorConversationHandle, @targetConversationHandle AS TargetConversationHandle;
  99. END;
  100.