我刚刚继承了一个使用服务代理的SQL Server 2005数据库(这是一个更大的项目/解决方案的一部分)。关于解决方案的一切都很好。我正在尝试使用服务代理SQL,我看到了这个陈述。
BEGIN DIALOG CONVERSATION @h
FROM SERVICE foo_Init
TO SERVICE 'foo_Target'
ON CONTRACT fooContract
为什么foo_Init不在单引号中?我希望它就像'foo_Target'一样。
答案 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引用目标服务(与启动器服务一样)才有意义,但并非总是如此。