为什么在目标服务时初始化服务不在引号中?

时间:2010-02-17 21:55:48

标签: sql-server-2005 syntax dialog quotes service-broker

我刚刚继承了一个使用服务代理的SQL Server 2005数据库(这是一个更大的项目/解决方案的一部分)。关于解决方案的一切都很好。我正在尝试使用服务代理SQL,我看到了这个陈述。

BEGIN DIALOG CONVERSATION @h
FROM SERVICE foo_Init
TO SERVICE 'foo_Target'
ON CONTRACT fooContract

为什么foo_Init不在单引号中?我希望它就像'foo_Target'一样。

2 个答案:

答案 0 :(得分:2)

来自在线图书

BEGIN DIALOG [ CONVERSATION ] @dialog_handle
   FROM SERVICE initiator_service_name
   TO SERVICE 'target_service_name'
       [ , { 'service_broker_guid' | 'CURRENT DATABASE' } ] 
   [ ON CONTRACT contract_name ]
   [ WITH
   [  { RELATED_CONVERSATION = related_conversation_handle 
      | RELATED_CONVERSATION_GROUP = related_conversation_group_id } ] 
   [ [ , ] LIFETIME = dialog_lifetime ] 
   [ [ , ] ENCRYPTION = { ON | OFF }  ] ]
[ ; ]

FROM SERVICE initiator_service_name 指定启动对话框的服务。指定的名称必须是当前数据库中的服务名称。为发起程序服务指定的队列接收目标服务返回的消息以及Service Broker为此对话创建的消息。

TO SERVICE'target_service_name' 指定用于启动对话框的目标服务。 target_service_name的类型为nvarchar(256)。 Service Broker使用逐字节比较来匹配target_service_name字符串。换句话说,比较是区分大小写的,并没有考虑当前的排序规则。

答案 1 :(得分:2)

FROM SERVICE必须是当前数据库中的服务,即您可以立即开始使用的服务。因此,您需要通过其sysname引用它。另一方面,服务只是“在那里”的东西。在BEGIN DIALOG语句执行时,它甚至可能不存在。当需要发送消息时,Service Broker路由将发挥作用并告诉Service Broker“实际存在的东西”实际位于何处以及如何到达它。因此,只有当目标服务位于同一个数据库中时,通过sysname引用目标服务(与启动器服务一样)才有意义,但并非总是如此。