配置SQL Server Service Broker来发送存储过程数据(下)

 
   | |

导读:本部分介绍了在SQL Server 2005中完善Service Broker配置的具体步骤。

关键词:SQL Server 2005 Service Broker 微软 XML MSMQ

正在加载数据...

【TechTarget中国原创】BROKER_INSTANCE参数是service_broker_guid字段的值,它来自远程服务器上的sys.databases 数据库视图。在队列之间发送消息,我们必须使用两个命令:第1个是BEGIN DIALOG命令,然后是SEND命令。使用BEGIN DIALOG命令来在发送和接收服务之间创建一个会话。如果我们使用一个已经存在的会话,那么我们就不需要使用BEGIN DIALOG命令。在使用BEGIN DIALOG命令创建了一个新的会话之后,通过使用BEGIN DIALOG命令返回的会话句柄,我们就可以使用SEND命令在会话上发送消息。

【TechTarget中国原创】BROKER_INSTANCE参数是service_broker_guid字段的值,它来自远程服务器上的sys.databases 数据库视图。

  在队列之间发送消息,我们必须使用两个命令:第1个是BEGIN DIALOG命令,然后是SEND命令。使用BEGIN DIALOG命令来在发送和接收服务之间创建一个会话。如果我们使用一个已经存在的会话,那么我们就不需要使用BEGIN DIALOG命令。在使用BEGIN DIALOG命令创建了一个新的会话之后,通过使用BEGIN DIALOG命令返回的会话句柄,我们就可以使用SEND命令在会话上发送消息。


DECLARE/font> @dialog_handle UNIQUEIDENTIFIER,
  @XMLData XML ;
  SET @XMLData = (SELECT * FROM sys.tables FOR XML AUTO)
  BEGIN DIALOG @dialog_handle
  FROM SERVICE [tcp://SearchSQLServer/SampleService]
  TO SERVICE 'tcp://SearchSQLServer/SampleService'
  ON CONTRACT [tcp://SearchSQLServer/SampleContract];
  SEND ON CONVERSATION @dialog_handle
  MESSAGE TYPE [tcp://SearchSQLServer/SampleMessageType]
  (@XMLData);

  可以使用RECEIVE命令来查看和处理消息。RECEIVE命令与SELECT很相似,它们都返回数据。然而,当使用RECEIVE命令时,消息只能接收一次。在消息被接收之后,如果它是会话的最后一个消息——大多数人在会话中只是输入一个消息——那么,使用END CONVERSATION命令来关闭它。RECEIVE命令可以与WAITFOR命令一起使用,而WHILE循环则在一个运行过程的队列中处理所有消息。


DECLARE @dialog_handle UNIQUEIDENTIFIER,
  @XMLData XML ;
  RECEIVE TOP (1) @dialog_handle = conversation_handle, @XMLData =
  CAST(message_body AS XML)
  FROM [tcp://SearchSQLServer/SampleQueue]
  END CONVERSATION @dialog_handle
  SELECT @XMLData

  当结束会话时,事实上会有一个消息从接收队列发送到发送队列来通知发送队列、服务和SQL Server会话已经关闭了。这个结束会话的消息必须由发送队列来处理,以便从队列删除数据。我们建议在发送队列上使用一个基本过程来自动清除这些消息。

CREATE PROCEDURE usp_ProcessAck
  AS
  DECLARE @xml AS XML
  DECLARE @dialog_handle as uniqueidentifier
  WHILE 1=1
  SET @dialog_handle = NULL
  WAITFOR ( RECEIVE TOP (1) @dialog_handle = conversation_handle, @xml =
  cast(message_body as xml)
  FROM [tcp://SearchSQLServer/SampleQueue]), TIMEOUT 1000
  IF @dialog_handle IS NULL
  break
  END CONVERSATION @dialog_handle
  END
  GO

  在我们创建了这个过程之后,再使用ALTER QUEUE来创建队列来自动地在消息到达时通过使用QUEUE的ACTIVATION命令自动运行该过程。我们可以通过设置MAX_QUEUE_READERS大于1来设置过程的并行执行数目。在繁重负荷的系统中,或者当处理花费一段时间时,额外的队列读取程序可以通过并行队列的数据处理来加速数据处理。


ALTER QUEUE [tcp://SearchSQLServer/SampleQueue]
  WITH ACTIVATION (STATUS=ON,
  PROCEDURE_NAME = dbo.usp_ProcessAck,
  MAX_QUEUE_READERS = 2,
  EXECUTE AS SELF)

  SQL Server Service Broker的配置可能很复杂,同时在因特网上关于它的文档也不多。然而,一旦配置并且正确地运行了Service Broker,那么它可以提供一个坚实的内部数据库或者外部数据库通信平台来快速一致地在系统之间发送数据。

 
查看全文
 
 
 
 
 

SQL Server存储过程

 
如果你对SQLServerPedia这个网站有所了解,那么就会发现在这里你能够找到很多自定义函数,几乎可以用在任何情况下。
 
如果你是一个SQL Server工程师,正在寻找一种可以让你的数据库跟Twitter进行对话的一条捷径。那么,一个第三方程序Tweet-SQL是不错的选择。
 
创建一个触发器可以保持两个独立数据库表的一致性,在更改被应用之前,是否有方法可以让触发器验证其它数据库/表中不存在的更新,专家给出了解答。
 
如何为INSERT查询编写一个存储过程并在CS文件中检索受影响的行,专家Denny Cherry将给出具体的实现代码。
 
本文中我们将讨论在迁移数据库中,如何应用存储过程来发挥SQL Server 2005中的功能特性,同时又不与现有函数发生冲突。
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录