扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年3月2日
关键字: SQL Server
在本页阅读全文(共4页)
列表A中的脚本建立我用作激活过程的存储过程。每次有消息到达SalesQueue队列时,就调用这个过程。
在这个过程中,我使用新的TSQL结构RECEIVE从SalesQueue队列中提取消息。(RECEIVE非常类似于SELECT语句,不同之处在于RECEIVE从队列中提取消息。)如果你需要查看消息的内容,但并不移动它们,你可以在队列上运行SELECT语句,就像在表中一样。
当我从队列收到一条消息时,我把来自队列的域值保存在当地变量中。我对@Message变更特别感兴趣,它将保存我提交到队列的XML文件。因为消息的正文以XML保存,我可以使用XQuery语句从XML文件中提取数据。我提取的数据是我提交到最初过程的变量。一旦我“切碎”了XML数据,我只需简单把这些值插入Sales表中。
既然我计划给SalesService服务发送消息,我需要一个发送消息的服务和队列。下面的语句建立RecordSalesQueue和RecordSalesService队列,后者被附加到RecordSalesQueue上。
CREATE QUEUE [RecordSalesQueue];
CREATE SERVICE [RecordSalesService] ON QUEUE [RecordSalesQueue];
GO
当你对一个Service Broker队列使用内部激活时,你需要启动内部激活并指定你将调用的存储过程。我最初建立SalesQueue时没有启动它,因此现在我必须启动它。这个操作用ALTER QUEUE语句来完成,如下:
ALTER QUEUE [SalesQueue] WITH ACTIVATION
(
STATUS = ON,
MAX_QUEUE_READERS = 1,
PROCEDURE_NAME = usp_RecordSaleMessage,
EXECUTE AS OWNER
);
GO
列表B中的脚本建立我在输入销售信息时将要用到的过程。我将保持简化,因此我仅向过程提交三个变量(尽管这不是一个很大的交易,但如有必要,可以提交更多变量)。
在这个过程中,你会注意到,我把提交到过程的参数插入到一个临时表中;然后我查询临时表,把结果集放到一个XML变量中。这种方法可以方便地把你的数据格式化成XML,而不用动态建立一个XML字符串。
实际上,BEGIN DIALOG CONVERSATION处理从RecordSalesService向SalesService提交消息的过程。这个语句返回一个会话句柄,你可以使用它来发送消息。SEND ON CONVERSATION语句执行发送XML消息的工作,SELECT语句从临时表中建立这个XML消息。
现在,我已经为激活过程做好准备,只等消息到达。要看它如何运行,执行下面的存储过程:
EXECUTE usp_SendSalesInfo '1/9/2005',30,90
执行这个过程后,运行下面的SELECT语句看Sales表中是否插入一条记录。
SELECT * FROM Sales;
内部激活的优点
我可能会看着上面的例子,心里想:“这有什么好处?不过是往表中增加一条记录而已!”在这种情况下,这是一个合理的问题。但是,不要遗漏这个例子背后的理念。
消息应用程序的目的是帮助你发送一条消息,并继续进行你的工作。在上面的例子中,如果从触发器中调用usp_SendSalesInfo存储过程,就需要在触发器下次激活前插入记录。如果触发器要完成许多处理工作,这肯定会造成系统瓶颈。但是,如果你只使用存储过程向队列传送消息,触发器就可以迅速地完成处理工作,而且可以在后台完成这些工作。
Tim Chapman是肯塔基州路易维尔市一家银行的SQL Server数据库管理员,他有超过7年的IT行业经验。他还通过了微软SQL Server 2000和SQL Server 2005的认证。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者