多个发起者将使用的服务代理程序开始对话对话..如何将参数传递给它

fa1*_*n3r 3 sql-server-2008 sql-server service-broker

开始对话的标准格式是这样的:

Declare @dialog_handle UNIQUEIDENTIFIER
BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE initiator_1
   TO SERVICE 'target_1'
   ON CONTRACT MyContract ;
Run Code Online (Sandbox Code Playgroud)

但是我想创建一个灵活的通用过程,它可以从多个启动器服务中的任何一个发送特定对话(假设我有 10 个使用相同存储过程的潜在启动器服务)。

Create Procedure SendJoinRequest (@initiatorServiceName varchar)
AS
   Declare @dialog_handle UNIQUEIDENTIFIER
BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE @initiatorServiceName
   TO SERVICE 'target_1'
   ON CONTRACT MyContract ;
Run Code Online (Sandbox Code Playgroud)

我想这行不通,因为服务的标识符在

FROM SERVICE @initiatorServiceName 
Run Code Online (Sandbox Code Playgroud)

实际上不能是字符串,而必须是服务的实际名称...是否有一种简单的方法可以将其作为参数传递?或者我是否必须将所有这些嵌套在一个令人讨厌的串联字符串执行中?

@String = blahblah + blah blah + escapecharacters + blah
execute(@String)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Rem*_*anu 5

实际上它会起作用。大多数 SSB 动词都接受参数作为参数(当然,RECEIVE 的 queuename 除外)。参数类型为sysname

Create Procedure SendJoinRequest 
   @from sysname, 
   @to sysname,
   @contract sysname,
   @messageType sysname,
   @body XML
AS
Declare @dialog_handle UNIQUEIDENTIFIER
BEGIN TRANSACTION
BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE @from
   TO SERVICE @to
   ON CONTRACT @contract
   WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @dialog_handle MESSAGE TYPE @messageType (@body);
COMMIT
Run Code Online (Sandbox Code Playgroud)